版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/V5ZSQ/article/details/83301981
Description
给出一个集合和一个数 。
集合里面有 个质数。
请你求出从$ 1$ 到$ m $的所有数中,至少能被集合中的一个数整除的数的个数。
Input
第一行两个正整数$ n$ 和$ m $。
第二行 个正整数,分别为集合中的质数。
Output
输出一个整数,表示符合要求的正整数的个数。
Sample Input
3 37
5 7 13
Sample Output
13
Solution
给出的都是素数,直接容斥即可,时间复杂度
Code
#include<cstdio>
using namespace std;
typedef long long ll;
int n,a[22];
ll m;
int main()
{
scanf("%d%lld",&n,&m);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
int N=1<<n;
ll ans=0;
for(int i=1;i<N;i++)
{
ll res=m;
int num=0;
for(int j=0;j<n;j++)
if((i>>j)&1)num++,res/=a[j];
if(num&1)ans+=res;
else ans-=res;
}
printf("%lld\n",ans);
return 0;
}