首页 > 代码库 > hdu1796:容斥入门题

hdu1796:容斥入门题

简单的容斥入门题。。

容斥基本的公式早就知道了,但是一直不会写。

下午看到艾神在群里说的“会枚举二进制数就会容斥”,后来发现还真是这样。。

然后直接贴代码了

#include <iostream>#include <stdio.h>#include<string.h>#include<algorithm>#include<string>#include<ctype.h>using namespace std;long long m,n,a[15];long long gcd(long long a,long long b){    return b?gcd(b,a%b):a;}long long lcm(long long a,long long b){    return a/gcd(a,b)*b;}void ini(){    for(int i=0;i<n;i++)    {        scanf("%I64d",a+i);        if(a[i]<1)        {            n--;i--;       //此题输入中可能有0        }    }}long long iae(){    long long res=0;    for(int i=1;i<(1<<n);i++)    {        long long mut=1,tmp=0;        for(int j=0;j<n;j++)        {            if(i&(1<<j))            {                tmp++;                mut=lcm(mut,a[j]);            }        }        if(tmp&1)        {            res+=(m-1)/mut;        }        else        {            res-=(m-1)/mut;        }    }    return res;}void solve(){    printf("%I64d\n",iae());}int main(){    while(scanf("%I64d%I64d",&m,&n)!=EOF)    {        ini();        solve();    }    return 0;}

 

hdu1796:容斥入门题