poj 2407 Relatives

#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

  

posted on 2011-07-20 22:51  sysu_mjc  阅读(114)  评论(0编辑  收藏  举报

导航