之前不了解容斥定理,导致一直超时,总而言之就是算不合题意的 然后减一下
链接:https://www.nowcoder.com/acm/contest/135/A
来源:牛客网
题目描述
若一个集合A内所有的元素都不是正整数N的因数,则称N与集合A无关。
给出一个含有k个元素的集合A={a1,a2,a3,...,ak},求区间[L,R]内与A无关的正整数的个数。
保证A内的元素都是素数。
输入描述:
输入数据共两行:
第一行三个正整数L,R,k,意义如“题目描述”。
第二行k个正整数,描述集合A,保证k个正整数两两不相同。
输出描述:
输出数据共一行:
第一行一个正整数表示区间[L,R]内与集合A无关的正整数的个数
示例1
输入
复制
1 10 4
2 3 5 7
输出
复制
1
示例2
输入
复制
2 10 4
2 3 5 7
输出
复制
0
说明
对于30%的数据:1<=L<=R<=10^6
对于100%的数据:1<=L<=R<=10^18,1<=k<=20,2<=ai<=100
在此之前如果还不了解容斥定理,可以戳这里https://blog.csdn.net/m0_37286282/article/details/78869512
先全部加起来再奇加偶减
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=LONG_LONG_MAX;
ll l,r,k;
ll A[25];
ll sum=0;
void dfs(ll x,ll now,ll c){//c记录个数
if(x>r){
return;
}
if(c&1){//奇数
sum+=r/x-(l-1)/x;
}
else{//偶数
sum-=r/x-(l-1)/x;
}
for(int i=now+1;i<=k;++i){
dfs(x*A[i],i,c+1);
}
}
int main(){
while(scanf("%lld%lld%lld",&l,&r,&k)!=EOF){
for(int i=1;i<=k;++i)
scanf("%lld",A+i);
sum=0;//算出sum是不满足条件个数
for(int i=1;i<=k;++i)
dfs(A[i],i,1);
cout<<(r-l+1)-sum<<endl;
}
return 0;
}