Description
给出一个集合和一个数 m m m。
集合里面有 n n n个质数。
请你求出从$ 1$ 到$ m $的所有数中,至少能被集合中的一个数整除的数的个数。
Input
第一行两个正整数$ n$ 和$ m $。
第二行 n n n个正整数,分别为集合中的质数。
( n ≤ 20 , 1 ≤ m ≤ 2 63 − 1 , p ≤ 1 0 9 ) (n\le 20,1\le m\le 2^{63}-1,p\le 10^9) (n≤20,1≤m≤263−1,p≤109)
Output
输出一个整数,表示符合要求的正整数的个数。
Sample Input
3 37
5 7 13
Sample Output
13
Solution
给出的都是素数,直接容斥即可,时间复杂度 O ( n ⋅ 2 n ) O(n\cdot 2^n) O(n⋅2n)
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;
}