【UVA10325】The Lottery——简单容斥定理

题意:给你一个数组,问 [1,n] 中有多少个数不能整除数组的任何一个数

分析:对于这种问题,我们可以求其逆问题,就是在区间[1,n]中存在多少数可以整除数组中的只少一个数
对于 a[i],Ai=na[i], ,所以我们可以用容斥定理来解决这个问题 num=|i=1nAi|=i=1n|Ai|i,j:1i<jn|AiAj|+i,j,k:1i<j<kn|AiAjAk|+(1)n1|A1A2A3An|
对于加减却决于数目
所以 ans=nnum

容斥定理博客

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;

typedef long long LL;

LL n,m;

LL Arr[20];

LL GCD(LL a,LL b)
{
    return b==0?a:GCD(b,a%b);
}

LL LCM(LL a,LL b)
{
    return a/GCD(a,b)*b;
}

int main()
{
    while(~scanf("%lld %lld",&n,&m))
    {
        for(int i = 0;i<m;i++)
        {
            scanf("%lld",&Arr[i]);
        }

        LL num = 0;

        for(int i = 1;i<=((1<<m)-1);i++)
        {
            LL ans = 1,ant =0 ;
            for(int j = 0;j<m;j++)
            {
                if(i&(1<<j))
                {
                    ans = LCM(ans,Arr[j]);

                    ant++;
                }
            }

            if((ant-1)%2)
            {
                num-=(n/ans);
            }
            else
            {
                num+=(n/ans);
            }
        }

        printf("%lld\n",n-num);
    }
    return 0;
}

你可能感兴趣的:(【UVA10325】The Lottery——简单容斥定理)