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< 
      
          
       
      
    
 
   

你可能感兴趣的:(Integer)