欧拉公式
欧拉φ函数:φ(n)是所有小于n的正整数里,和n互素的整数的个数。n是一个正整数。
欧拉证明了下面这个式子:
如果n的标准素因子分解式是p1^a1*p2^a2*……*pm^am,其中众pj(j=1,2,……,m)都是素数,而且两两不等。则有
φ(n)=n(1-1/p1)(1-1/p2)……(1-1/pm)
如果n为奇素数,φ(n)=n-1.
费马小定理:a^(p-1)≡1(mod p)
POJ 2407 求一个数的欧拉函数值
Source Code
Problem: 2407 | User: pbj | |
Memory: 228K | Time: 16MS | |
Language: C++ | Result: Accepted |
- Source Code
#include <iostream> #include <cmath> using namespace std; unsigned euler(unsigned x) { unsigned i,res=x; for(i=2;i<(int)sqrt(x*1.0)+1;i++) if(x%i==0) { res=res/i*(i-1); while(x%i==0) x/=i; } if(x>1) res=res/x*(x-1); return res; } int main() { int n; while(cin>>n && n) { printf("%d/n",euler(n)); } return 0; }
poj 2478 欧拉函数求和
Source Code
Problem: 2478 | User: pbj | |
Memory: 13272K | Time: 32MS | |
Language: C++ | Result: Accepted |
- Source Code
#include <iostream> #define MAX 1000000 using namespace std; int prime[MAX+1],phi[MAX+1]; long long sum[MAX+1]; bool isprime[MAX+1]; void get_phi() { int i,j,len=0; for(i=2;i<=MAX;i++) { if(!isprime[i]) { prime[++len]=i; phi[i]=i-1; } for(j=1;j<=len && prime[j]*i<=MAX;j++) { isprime[prime[j]*i]=1; if(!(i%prime[j])) { phi[i*prime[j]]=phi[i]*prime[j]; break; } else phi[i*prime[j]]=phi[i]*(prime[j]-1); } } } int main() { int i,n; get_phi(); phi[1]=0; for(i=2;i<=MAX;i++) sum[i]=sum[i-1]+phi[i]; while(cin>>n && n) { cout<<sum[n]<<endl; } return 0; }