How many integers can you find HDU - 1796

容斥原理加二进制枚举,题目意思是让我们找从1到n-1中有多少个能被m序列中的数整除的个数(被任意一个整除都可以),接下来就是一个简单的二进制枚举的题了,遵循奇加偶减的原则,然后就可以敲了,不会二进制枚举的可以私戳这位的博客

注意多组输入和long long

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int gcd(int a,int b) {
    return b==0?a:gcd(b,a%b);
}
int main() {
    int n,m;
    ll a[20];
    ll data;
    while(~scanf("%d%d",&n,&m)) {
        int t=0;
        for(int i=0; i<m; i++) {
            scanf("%lld",&data);
            if(data!=0)
                a[t++]=data;
        }
        ll ans=0;
        for(int i=1; i<(1<<t); i++) {
            int cnt=0;
            ll lcm=1;
            for(int j=0; j<t; j++) {
                if((1<<j)&i) {
                    cnt++;
                    lcm=lcm*a[j]/gcd(lcm,a[j]);
                }
            }
            if(cnt%2==1)
                ans+=(n-1)/lcm;
            else if(cnt%2==0)
                ans-=(n-1)/lcm;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

 

posted @ 2018-12-25 21:46  hum0r0  阅读(7)  评论(0)    收藏  举报