zoukankan      html  css  js  c++  java
  • 容斥理论

    输入N和M,M表示接下来会输入M个数,求从1到N中不能被这M个数整出的数的个数。

    思路:先算出从1到N中能被这M个数整除(即是这M个数中任意一个数的倍数)的数的个数,在用N减去就是答案了。

    #include <iostream>
    #include <string.h>
    using namespace std;
    long long num[20];

    long long gcd(long long a,long long b) //求a和b的最大公约数
    {
        return b ? gcd(b,a%b) : a;//b为0时返回a,b大于0时返回gcd(b,a%b)
    }

    int main()
    {
        long long n;
        int m;
        while(cin>>n>>m)
        {
            for(int i=0; i<m; i++)
            cin>>num[i];
            int ans=0;
            for(int i=1;i<(1<<m);i++)
            {
                int b=0;
                long long w=1;
                for(int j=0;j<m;j++)
                if(i&(1<<j))
                   {
                      b++;
                      w=w/gcd(num[j],w)*num[j];//表示w和num[j]的最小公倍数
                   }
                if(b&1)//表示如果b是奇数,就让最后结果加上所得个数
                ans+=n/w;
                else ans-=n/w;
            }
            cout<<n-ans<<endl;
        }
        return 0;
    }

  • 相关阅读:
    hdu 4614 线段树 二分
    cf 1066d 思维 二分
    lca 最大生成树 逆向思维 2018 徐州赛区网络预赛j
    rmq学习
    hdu 5692 dfs序 线段树
    dfs序介绍
    poj 3321 dfs序 树状数组 前向星
    cf 1060d 思维贪心
    【PAT甲级】1126 Eulerian Path (25分)
    【PAT甲级】1125 Chain the Ropes (25分)
  • 原文地址:https://www.cnblogs.com/chen9510/p/4696325.html
Copyright © 2011-2022 走看看