用“容斥原理”+gcd+lcm

这是一道关于利用容斥原理和数论概念来解决问题的数学题目。给定四张卡片,上面分别标有四个正整数,当勇士的编号是卡片上任意一张号码的倍数时,该勇士被认为是优秀的。输入包括勇士总数n和四张卡片上的数字a, b, c, d,任务是计算出能挑选出的优秀勇士数量。样例输入为10名勇士和卡片数字2, 3, 5, 7,输出应为9。数据规模逐步增大,最高可达n=10^18,a, b, c, d<=10^4。" 117809066,5518159,软件测试流程详解,"['软件测试', '测试流程', '测试用例', '测试策略', '测试报告']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

容斥原理:基本的题目都是 ans +奇数-偶数

而我们现在有四张卡片里面分别标记了一个号码, 当勇士的编号为其中某-张卡片中号码的倍数时说明该勇士是优秀的。
目前有nn名勇士(编号1 - n1−n)并且告诉你卡片内的号码,请你计算出能挑选出多少位勇士

输入
第一个行读入一个正整数nn

第二行读入四个正整数a, b, c, d分别表示四张卡片内的号码

输出
输出挑选出来的勇士个数

样例
输入复制
10
2 3 5 7
输出复制
9
提示
数据规模

对于20%20%的数据,1 \le n \le 10^4, 1 \le a, b,c,d \le 10^21≤n≤10
4
,1≤a,b,c,d≤10
2

对于60%60%的数据,1 \le n \le 10^8, 1 \le a, b,c,d \le 10^21≤n≤10
8
,1≤a,b,c,d≤10
2

对于100%100%的数据,1 \le n \le 10^{18}, 1 \le a, b,c,d \le 10^41≤n≤10
18
,1≤a,b,c,d≤10
4

#include<iostream>
using namespace std;
#define ll long long
ll a,b,c,d;
ll n;
ll ans;
ll gcd(ll a,ll b)
{
   
	ll t;
	if
### Python 实现容斥原理 #### 示例代码解释 为了计算满足特定条件的元素数量,容斥原理是一种有效的数学方法。以下是基于给定范围内的神奇数字问题来展示如何利用Python实现这一原则。 ```python import math def nthMagicalNumber(n: int, a: int, b: int) -> int: mod = 10**9 + 7 # 计算a和b的最大公约数gcd以及最小公倍数lcm lcm_value = (a * b) // math.gcd(a, b) # 使用二分查找找到第n个神奇数字的位置 low, high = 2, n * min(a, b) while low <= high: mid = (low + high) >> 1 # 应用容斥原理计算不大于mid的神奇数字的数量f(mid) count = mid // a + mid // b - mid // lcm_value if count >= n: result = mid % mod high = mid - 1 else: low = mid + 1 return result print(nthMagicalNumber(5, 2, 3)) # 输出应为6 ``` 这段程序定义了一个函数`nthMagicalNumber`用于求解第N个神奇数字[^5]。这里的关键在于理解并应用了容斥原理去估算某个范围内有多少个数能够被指定的一组正整数中的至少一个整除: - 首先通过最大公约数(GCD)得到两数之间的最小公倍数(LCM),这有助于后续排除重复计数的情况; - 接着采用二分搜索的方式逐步缩小可能的结果区间直至定位到目标位置; - 对每一个中间值`mid`,按照公式\[ \text{count}=\left\lfloor{\frac {mid}{a}}\right\rfloor+\left\lfloor{\frac {mid}{b}}\right\rfloor-\left\lfloor{\frac {mid}{LCM(a,b)}}\right\rfloor \] 来判断其内含有多少符合条件的数值; 此过程不仅体现了算法设计上的巧妙之处,同时也很好地诠释了什么是容斥原理及其具体应用场景下的编程实践方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值