zoukankan      html  css  js  c++  java
  • HDU 1796 How many integers can you find (容斥原理 入门)

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1796 题目大意:给定一个N和一个有M个数的集合S,求出小于N的数中有多少能被集合S中的数整除. 思路:基本的容斥原理。设Xi为小于N的数中能整除集合中i个数的个数,则Xans = X1 - X2 + X3 - X4 + …… 需要注意的就是在求能整除多个数的个数的时候,应该用N除以它们的最小公倍数,而不是他们的乘积。  
    #include 
    #include 
    using namespace std;
    
    vector  p;
    
    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 * b / gcd(a, b);
    }
    
    long long solve(int n){
        long long res = 0;
        for (int msk = 1; msk < (1 << p.size()); msk ++){
            int mult = 1, bit = 0;
            for (int i = 0; i < p.size(); i ++){
                if (msk & (1 << i)){
                    bit ++;
                    mult = lcm(mult, p[i]);
                }
            }
            int cur = (n - 1) / mult;
            if (bit % 2 == 1){
                res += cur;
            }
            else{
                res -= cur;
            }
        }
        return res;
    }
    
    int main(){
        int n,m;
        while(cin>>n>>m){
            p.clear();
            for (int i = 0; i < m; i ++){
                int x;
                cin>>x;
                if (x != 0)
                    p.push_back(x);
            }
            cout<
     
    举杯独醉,饮罢飞雪,茫然又一年岁。 ------AbandonZHANG
  • 相关阅读:
    DRF 分页
    DRF 权限 频率
    DRF 版本 认证
    opencl(6)读写传输命令、内存映射命令
    opencl(5)缓存对象
    opencl(4)命令队列
    opencl(3)程序、内核
    opencl(2)平台、设备、上下文的获取与信息获取
    epoll
    unsigned 变量名:n
  • 原文地址:https://www.cnblogs.com/AbandonZHANG/p/4114184.html
Copyright © 2011-2022 走看看