hdu1796(二进制容斥原理基本运用)

来源:互联网 发布:身份证被别人注册淘宝 编辑:程序博客网 时间:2024/05/16 00:39


给出n,和m个数,求小于n,且可以被m个数中任意一个整除的数有哪些?

就二进制枚举哪些数,然后取最小公倍数,搞一搞就可以了


#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define ll long longusing namespace std;ll n,m,a[20];ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}int main(){while (scanf("%lld%lld",&n,&m)!=EOF){n--;int h=1;for (int i=1;i<=m;i++){scanf("%lld",&a[h]);if (a[h]!=0)h++;}m=h-1;ll ans=0,k,id;for (int i=1;i<(1<<m);i++){k=1;id=0;for (int j=0;j<m;j++) if (i&(1<<j)) id++,k=(a[j+1]/gcd(a[j+1],k)*k);//注意一定是要去最小公倍数,不是倍数!!!!!!!!if (id&1) ans+=n/k;else ans-=n/k; }printf("%lld\n",ans);}return 0;}


0 0
原创粉丝点击