集合中的质数(容斥原理&&位操作)

来源:互联网 发布:四分位数java 编辑:程序博客网 时间:2024/05/24 06:37

题目描述

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

集合里面有n个质数。

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

输入描述:

第一行两个正整数 n 和 m 。第二行n个正整数,分别为集合中的质数。

输出描述:

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

输入

3 375 7 13

输出

13

备注:

对于100%的数据,有n<=20,m为有符号64位正整数,集合内质数<=1000000000
#include<iostream>#include<cstdio>#include<string>#include<queue>#include<stack>#include<map>#include<vector>#include<list>#include<set>#include<iomanip>#include<cstring>#include<cctype>#include<cmath>#include<cstdlib>#include<ctime>#include<cassert>#include<sstream>#include<algorithm>using namespace std;#define MAXN 1000005#define INF 0x3f3f3f3f#define PI acos(-1.0)typedef long long ll;int a[25];int main(){ll n,m,ans=0;scanf("%lld%lld",&n,&m);for (int i=0; i<n; i++)scanf("%d",&a[i]);for (int s=1; s<(1<<n); s++)//取与不取{int t=0;//共取了几个,奇加偶减,容斥原理long long ss=m;//满足条件的数的个数for (int j=0; j<n; j++)if ((s>>j)&1)//每一位取,或不取{t++;ss/=a[j];}//cout<<ss<<endl;if (t&1)ans+=ss;elseans-=ss;}printf("%lld\n",ans);}

原创粉丝点击