首页 > 代码库 > hdu How many integers can you find
hdu How many integers can you find
题意:找出小于n是m个数每个数的倍数的数的个数。
思路:用二进制表示是那几个数的倍数。 二进制进行容斥,去掉小于0的数。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 __int64 n,m,g; 7 __int64 a[1000],b[1000]; 8 9 __int64 gcd(__int64 a,__int64 b)10 {11 return b==0?a:gcd(b,a%b);12 }13 14 int main()15 {16 while(scanf("%I64d%I64d",&n,&m)!=EOF)17 {18 memset(a,0,sizeof(a));19 __int64 cnt=0;20 for(int i=0; i<m; i++)21 {22 __int64 x;23 scanf("%I64d",&x);24 if(x)25 a[cnt++]=x;26 }27 __int64 ans=0;28 for(int i=1; i<(1<<cnt); i++)29 {30 __int64 xx=0;31 __int64 x=1;32 memset(b,0,sizeof(b));33 for(int j=0; j<cnt; j++)34 {35 if(i&(1<<j))36 {37 b[xx]=a[j];38 xx++;39 x*=a[j];40 }41 }42 if(xx>1)43 {44 g=(b[0]*b[1])/gcd(b[0],b[1]);45 for(int k=2; k<xx; k++)46 {47 g=(g*b[k])/gcd(g,b[k]);48 }49 x=g;50 }51 if(xx%2!=0)52 {53 ans+=((n-1)/x);54 }55 else56 {57 ans-=((n-1)/x);58 }59 }60 printf("%I64d\n",ans);61 }62 return 0;63 }
hdu How many integers can you find
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。