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;

}

 

你可能感兴趣的:(HDU)