HDU1787 GCD Again(容斥原理)
2014-03-09 21:52
232 查看
和1695类似的题目,只不过这次求的是不互质数的个数.
#include <iostream> #include <memory.h> #include <cstdio> #include <vector> using namespace std; const int MAX = 1000005; bool is_prime[MAX]; int prime[MAX / 10], prime_idx; void init_prime(){ memset(is_prime + 2, true, sizeof(is_prime)); for (int i = 2; i < MAX; ++i){ if(is_prime[i]){ prime[prime_idx++] = i; for(int j = i + i; j < MAX; j += i){ is_prime[j] = false; } } } } int inclusion_exlusion(int r, int n){ int res = 0, tn = n; vector<int> p; for(int i = 0; i < prime_idx && prime[i] < tn; ++i){ if(tn % prime[i] == 0){ p.push_back(prime[i]); while(tn % prime[i] == 0){ tn /= prime[i]; } } } if(tn > 1){ p.push_back(tn); } for(int i = 1; i < (1 << p.size()); ++i){ int bits = 0, multiple = 1; for(int j = 0; j < p.size(); ++j){ if(i & (1 << j)){ bits++; multiple *= p[j]; } } if(bits & 1)res += r / multiple; else res -= r / multiple; } return res; } int main(int argc, char const *argv[]){ init_prime(); int n; while(scanf("%d", &n) && n){ printf("%d\n", inclusion_exlusion(n - 1, n)); } return 0; }
相关文章推荐
- GCD Again HDU - 1787 (欧拉函数 or 容斥原理)
- hdu1787 GCD Again 欧拉函数在线算法 待补完
- 欧拉函数:HDU1787-GCD Again(欧拉函数的模板)
- [HDU1787]GCD Again(根n求phi)
- HDU1787 GCD again 欧拉公式 的运用
- hdu1787——GCD Again(欧拉函数入门)
- hdu1787 GCD Again(数论:欧拉函数)
- (hdu1787)GCD Again(欧拉函数)
- HDU1787 GCD Again【欧拉函数】
- hdu 1695 GCD(组合数学:容斥原理)
- HDOJ 题目1787 GCD Again(欧拉函数)
- hdu 1787 GCD Again 欧拉函数小水水 数论
- hdu 1695 GCD (素数筛选 + 欧拉函数 + 容斥原理)
- HDU 1695 GCD(素因子分解+容斥原理+欧拉函数)
- hdu 4497 GCD and LCM(唯一分解+容斥原理)
- 51nod-【1787 GCD Again】
- HDU 1787 GCD Again/HDU 2824 The Euler function(欧拉函数模板)
- ACM学习历程—HDU1695 GCD(容斥原理 || 莫比乌斯)
- HDU 1787 GCD Again
- 【容斥原理,莫比乌斯反演】用容斥替代莫比乌斯反演第二种形式解决gcd统计问题