hdu-1796
http://acm.hdu.edu.cn/showproblem.php?pid=1796? ?
題意:給你兩個數n,m,即讓你從1~n-1個數里有多少個能整除m個數中任意一個數?
題解:容斥原理:ORZ vici大牛寫的比較詳細 ??http://www.cppblog.com/vici/archive/2011/09/05/155103.html#userconsent#
?
/*********************************************************** * 容斥原理 * * 求幾個數的組合(用二進制優化枚舉各個狀態)的最小公倍數, * 用n/lcm,如果這幾個數的個數為奇數則加,偶數則減, * 注:當這幾個數有0時,先把0給去掉 * * * * ***********************************************************/ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; typedef long long LL; int st[15]; LL n; LL Gcd(LL a,LL b){//最大公約數return b == 0 ? a : Gcd(b,a%b); } LL Lcm(LL a,LL b){//最小公倍數return a * b / Gcd(a,b); } LL find(int num){//尋找組合int cnt = 0,c = 0;LL lcm = 1;while(num){if(num & 1) {lcm = Lcm(lcm,(LL)st[cnt]);c++;}cnt ++;num /= 2;}LL ans = (n-1) / lcm;if(c % 2) return ans;return -ans; } void solve(int m){//枚舉各個狀態二進制優化LL sum = 0;for(int i = 1;i < (1 << m) ;i++){sum += find(i);}cout << sum << endl; } int main(){ // freopen("1.txt","r",stdin);int x,m;while(cin >> n >> m){int k = 0;for(int i = 0;i < m;i++){cin >> x;if(x) //如果存在0,先排除 st[k ++] = x;}solve(k);} }總結
- 上一篇: poj - 2356 Find a mu
- 下一篇: Ural 1207. Median on