标签:style blog io color sp for div on 2014
1, 求 {1, r} 中与 n 互质的个数:(容斥原理)
int solve (int n, int r) { vector<int> p; for (int i=2; i*i<=n; ++i) if (n % i == 0) { p.push_back (i); while (n % i == 0) n /= i; } if (n > 1) p.push_back (n); int sum = 0; for (int msk=1; msk<(1<<p.size()); ++msk) { int mult = 1,bits = 0; for (int i=0; i<(int)p.size(); ++i) if (msk & (1<<i)) { ++bits; mult *= p[i]; } int cur = r / mult; if (bits % 2 == 1) sum += cur; else sum -= cur; } return r - sum; }
2. hdu 1796 How many integers can you find (dfs 容斥原理写法)
#include <stdio.h> #include <algorithm> using namespace std; typedef __int64 LL; int fac[12],top,ans,n; int gcd(int a,int b) { return b==0 ?a:gcd(b,a%b); } int lcm(int a,int b) { return a/gcd(a,b)*b; } void dfs(int i,int cnt,int num,int m) { if(cnt == m) { int sum = (n-1)/num; m&1 ? ans += sum : ans -= sum; return ; } if(top-i < m-cnt) return ; int LCM = lcm(num,fac[i]); if(LCM < n) dfs(i+1,cnt+1,LCM,m); dfs(i+1,cnt,num,m); } int main() { while(~scanf("%d%d",&n,&top)) { ans=0; for(int i=0;i<top;i++) { scanf("%d",&fac[i]); if(!fac[i]) i--,top--; } for(int m=1;m<=top;m++) dfs(0,0,1,m); printf("%d\n",ans); } return 0; }
标签:style blog io color sp for div on 2014
原文地址:http://blog.csdn.net/u013514722/article/details/41250579