hdu 1796

一下午 终于行了

基本的容斥定理

收藏
2314

容斥原理
编辑

在计数时,必须注意无一重复,无一遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。

1公式编辑

也可表示为
设S为有限集,
,则

#include<iostream>

int a[12];
__int64 n;
__int64 sum;
int m;
__int64 gcd(__int64 x,__int64 y)
{
    __int64 t;
    if(x<y)
    {
        t=x;
        x=y;
        y=t;
    }
    while(y)
    {
        t=x%y;
        x=y;
        y=t;
    }
    return x;
}
void dfs(int j,__int64 lcm,int num)
{
    if(num>m) return ;
    lcm=lcm*a[j]/gcd(lcm,a[j]);
    if(num%2==0) sum-=(n-1)/lcm;
    else sum+=(n-1)/lcm;
    for(int i=j+1;i<m;i++)
        dfs(i,lcm,num+1);
}
int main()
{
    while(scanf("%I64d%d",&n,&m)!=EOF)
    {
        for(int i=0;i<m;i++)
        {
            scanf("%d",&a[i]);
            if(a[i]==0)
                i--,m--;
        }
        sum=0;
        for(i=0;i<m;i++)
            dfs(i,a[i],1);
        printf("%I64d\n",sum);
    }
    return 0;
}
posted @ 2014-04-26 19:10  _一千零一夜  阅读(84)  评论(0编辑  收藏  举报