POJ 2407 Relatives 欧拉函数
2012-01-24 15:23
591 查看
题意很明确,比n小且与n互质的数的个数
欧拉函数就是用来解决这个的
首先要知道 【定理】正整数n(n≥2)可以唯一分解成素数乘积,即:n =p[1]^r1 * p[2] ^r2 * p[3]^r3. *...* p[s]^rs
其次欧拉函数有两个性质,可以用来编程,单独求phi函数:
① Ø(m) = m ( 1- 1/p[1]) ( 1- 1/p[2])…( 1- 1/p[s])
② Ø(p^k) = p^k – p^(k-1) = (p-1)p^(k-1)
下面是预处理打表的
欧拉函数就是用来解决这个的
首先要知道 【定理】正整数n(n≥2)可以唯一分解成素数乘积,即:n =p[1]^r1 * p[2] ^r2 * p[3]^r3. *...* p[s]^rs
其次欧拉函数有两个性质,可以用来编程,单独求phi函数:
① Ø(m) = m ( 1- 1/p[1]) ( 1- 1/p[2])…( 1- 1/p[s])
② Ø(p^k) = p^k – p^(k-1) = (p-1)p^(k-1)
/* ID: sdj22251 PROG: subset LANG: C++ */ #include <iostream> #include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <cctype> #include <string> #include <cstring> #include <cmath> #include <ctime> #define MAXN 305 #define INF 100000000 #define eps 1e-7 #define PI 3.1415926535898 using namespace std; int euler(int n) { int x = n; int i; int phi = n; for (i = 2; i * i <= x; i++) { if (x % i == 0) { phi = phi / i * (i - 1) ; while (x % i == 0) x /= i; } } if (x != 1) phi = phi / x * (x - 1); return phi; } int main() { int n; while(scanf("%d", &n) != EOF && n) { printf("%d\n", euler(n)); } return 0; }
下面是预处理打表的
/* ID: sdj22251 PROG: subset LANG: C++ */ #include <iostream> #include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <cctype> #include <string> #include <cstring> #include <cmath> #include <ctime> #define MAXN 305 #define INF 100000000 #define mod 1000000007 #define eps 1e-7 #define PI 3.1415926535898 using namespace std; int phi[100001]; void euler() { phi[1] = 1; for(int i = 2; i <= 100000; i++) if(!phi[i]) { for(int j = i; j <= 100000; j += i) { if(!phi[j]) phi[j] = j; phi[j] = phi[j] / i * (i - 1); } } } int main() { euler(); int T, n; scanf("%d", &T); while(T--) { scanf("%d", &n); printf("%d\n", phi ); } return 0; }
相关文章推荐
- POJ-2407-Relatives-欧拉函数
- POJ 2407 Relatives 欧拉函数题解
- POJ 2407-Relatives-欧拉函数
- POJ2407 ZOJ1906 UVA10229 Relatives【欧拉函数+数论】
- POJ 2407 Relatives 欧拉函数
- 数论 - 欧拉函数模板题 --- poj 2407 : Relatives
- [省选前题目整理][POJ 2407]Relatives(欧拉函数)
- (Relax 数论1.7)POJ 2407 Relatives(使用欧拉函数来求[1,n]中与n互质的整数的个数)
- POJ-2407-Relatives(欧拉函数模板题)
- poj 2407 Relatives(欧拉函数模板题)
- POJ 2407 Relatives 欧拉函数(简单求函数值)
- POJ 2407 Relatives(欧拉函数)
- 【POJ】2407 - Relatives(欧拉函数)
- POJ 2407 Relatives (欧拉函数)
- POJ 2407 Relatives(欧拉函数的应用)
- POJ 2407 Relatives 欧拉函数
- poj 2407Relatives(数论:欧拉函数)
- POJ 2407-Relatives (欧拉函数)
- [POJ 2407]Relatives(欧拉函数)
- poj 2407 Relatives(欧拉函数模板)