poj 2407 Relatives
2011-07-20 22:51
246 查看
#include <iostream> //利用欧拉函数φ(n),求出跟n互质且小于n的正整数的个数 using namespace std; int main () { int n,j,phi; while(scanf("%d",&n)&&n) { phi=1; for(j=2;j*j<=n;j++) //j是逐步增加的,因为一次while循环会完全排除掉一个素数因子,所以剩下的素数因子值肯定更大,这里j的取值范围本身是按照判断素数 { if(n%j!=0)continue; while(n%j==0) //能进入循环内的j一定是素数 { n=n/j; phi*=j; } phi=phi*(j-1)/j; //不能写成sum*=(j-1)/j;因为(j-1)/j=0,sum=0 //执行完这句后,正好φ(a)= (b-1) * b^(k-1), (a=b^k,b是素数) } if(n!=1) phi*=n-1; //求到最后,n一定会变成素数,即a=b^k,k=0,由(b-1) * b^(k-1),得(n-1)*( (n-1)^0 )=n-1 printf("%d\n",phi); //因为当n=1时,sum=1,满足题意,所以不用单独判断if(n==1) printf("%d\n",1); } return 0; } //一个正整数总可以表示成素数的乘积: n = p1^k1 * p2^k2 * ... * pn^kn (这里p1,p2,..pn是素数) //若a是素数b的k次幂,即a=b^k, 则φ(a)=b^k - b^(k-1)= (b-1) * b^(k-1),因为除了b的倍数(由于b^k=b*(b^k-1),故有b^(k-1)个)外,其他数都跟a互质 //若n = p1^k1 * p2^k2 (p1,p2是素数) 则φ(n)=( (p1-1) * p1^(k1-1) ) * ( (p2-1) * p2^(k2-1) ) //当n本身是素数的话,φ(n)=(n-1) * n^(1-1),即φ(n) = n-1
相关文章推荐
- POJ_2407_Relatives(欧拉函数)
- 【POJ-2407】Relatives
- 欧拉函数 POJ 2407 Relatives&&POJ 2478 Farey Sequence
- 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 2407 : Relatives
- Relatives 【poj-2407】【欧拉函数】
- POJ-2407-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