Newcoder 39 E.集合中的质数(容斥原理)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/V5ZSQ/article/details/83301981

Description

给出一个集合和一个数 m m

集合里面有 n n 个质数。

请你求出从$ 1$ 到$ m $的所有数中,至少能被集合中的一个数整除的数的个数。

Input

第一行两个正整数$ n$ 和$ m $。

第二行 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)

Output

输出一个整数,表示符合要求的正整数的个数。

Sample Input

3 37
5 7 13

Sample Output

13

Solution

给出的都是素数,直接容斥即可,时间复杂度 O ( n 2 n ) O(n\cdot 2^n)

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;
}

猜你喜欢

转载自blog.csdn.net/V5ZSQ/article/details/83301981
39