hdu 1796 How many integers can you find (容斥原理)

来源:互联网 发布:php字符串替换 第一个 编辑:程序博客网 时间:2024/05/16 18:41


计数在<n的整数中所有能整除给出集合中某个数的数的个数,ans=x1-x2+x3-x4.....(xi表示能整除集合中i个数的数的个数,用容斥原理,这里就是“奇加偶减”)

一个数整除i个数,只要能整除这i个数的最小公倍数就行了,dfs枚举每i个数的最小公倍数


#include<stdio.h>#include<string.h>#define MAXN 15int a[MAXN],n,m,ans;int gcd(int a,int b) {return b==0?a:gcd(b,a%b);}int lcm(int a,int b) {return a/gcd(a,b)*b;}int k;void dfs(int p,int cnt,int val){    if(cnt==0)    {        val=(n-1)/val;        k&1?ans+=val:ans-=val;        return ;    }    if(p>=m) return ;    if(m-p+1<cnt) return ;    int t=lcm(val,a[p]);    if(t<n) dfs(p+1,cnt-1,t);    dfs(p+1,cnt,val);}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        for(int i=0;i<m;i++)        {            scanf("%d",&a[i]);            if(!a[i])            {                m--;                i--;            }        }        ans=0;        for(int i=1;i<=m;i++)        {            k=i;            dfs(0,i,1);        }        printf("%d\n",ans);    }    return 0;}


0 0