HDU 1796 C - How many integers can you find -容斥

来源:互联网 发布:苹果适合java开发吗 编辑:程序博客网 时间:2024/06/14 15:21

http://bak.vjudge.net/problem/13388/origin


题意:经典容斥。。。不过给出的数不是互质的,容斥的时候不是用乘积,是用lcm


#include<iostream>#include<cstdio>#include<algorithm>using namespace std;typedef long long  ll;const ll p =1000000007;const int  N=100000;ll lcm(ll a,ll b){    return a*b/__gcd(a,b);}int aa[11];int main(){    ll n;    int m;    while(scanf("%lld%d",&n,&m)!=EOF)    {        n--;        int id=0;        for (int i=0; i<m; i++)        {            scanf("%d",&aa[id++]);            if (aa[id-1]==0)id--;        }        m=id;        int all=1<<m;        ll ans=0;        for (int i=1; i<all; i++)        {             ll tmp=1;            int cun=0;            for (int j=0; j<m; j++)            {                if ((1<<j)&i)   tmp=lcm(tmp,aa[j]),cun++;            }            if (cun%2)                ans+=n/tmp;            else ans-=n/tmp;        }        printf("%lld\n",ans);    }    return 0;}


0 0
原创粉丝点击