hdu-1796 How many integers can you find---容斥定理
生活随笔
收集整理的這篇文章主要介紹了
hdu-1796 How many integers can you find---容斥定理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:
http://acm.hdu.edu.cn/showproblem.php?pid=1796
題目大意:
給定n和一個大小為m的集合,集合元素為非負整數。為1...n-1內能被集合里任意一個數整除的數字個數。n<=2^31,m<=10
解題思路:
容斥定理
枚舉m個元素的所有非空子集,求出lcm,如果子集元素數目為偶數那就減去,否則就加上。
挑戰:P296有公式
1 #include<iostream> 2 using namespace std; 3 typedef long long ll; 4 const int maxn = 1e6 + 10; 5 ll n, m; 6 int a[50]; 7 ll gcd(ll a, ll b) 8 { 9 return b == 0 ? a : gcd(b, a % b); 10 } 11 void solve() 12 { 13 ll ans = 0; 14 for(int i = 1; i < (1 << m); i++) 15 { 16 int num = 0; 17 for(int j = i; j != 0; j >>= 1)if(j & 1)num++;//i的二進制中1的個數 18 ll lcm = 1; 19 for(int j = 0; j < m; j++) 20 { 21 if((1 << j) & i) 22 { 23 lcm = lcm / gcd(lcm, a[j]) * a[j]; 24 if(lcm > n)break; 25 } 26 } 27 if(num&1)ans += n / lcm; 28 else ans -= n / lcm; 29 } 30 cout<<ans<<endl; 31 } 32 int main() 33 { 34 while(cin >> n >> m) 35 { 36 n--;//需要自減1,因為是1-n-1 37 int tot = 0, x; 38 for(int i = 0; i < m; i++)//可能有0元素 39 { 40 cin >> x; 41 if(x)a[tot++] = x; 42 } 43 m = tot; 44 solve(); 45 } 46 return 0; 47 }?
轉載于:https://www.cnblogs.com/fzl194/p/9075139.html
總結
以上是生活随笔為你收集整理的hdu-1796 How many integers can you find---容斥定理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【资源共享】休眠唤醒 开发指南
- 下一篇: OkHttp简化请求封装思路