您的位置:首页 > 其它

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


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: