poj 2407 Relatives

#include<stdio.h>
#define INF 1000000
int s;
int f[INF];
int prime[INF];
int phi[INF];
void init()
{
    int i,j,k=0;
    for(i=2;i*i<=INF;i++)
    {
        for(j=i*i;j<INF;j=j+i)
        f[j]=1;
    }
    for(i=2;i<=INF;i++)
    if(f[i]==0)
        prime[k++]=i;
    //计算INF以下的所有欧拉函数
    for(i=1;i<=INF;i++)
    phi[i]=i;
    for(i=2;i<=INF;i++)
        if(f[i]==0)
        for(j=i;j<=INF;j+=i)
        phi[j]=phi[j]/i*(i-1); //此处注意先/i再*(i-1),否则范围较大时会溢出
}
int euler(int n) //求单个的欧拉函数
{
    int i,res=n;
    for(i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            res=(res/i)*(i-1);
            while(n%i==0)
            n/=i;
        }
    }
    if(n!=1)
           res=(res/n)*(n-1);
    return res;
}
int main()
{
    //init();
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)
        break;
        printf("%d\n",euler(n));
        //printf("%d")
    }
    return 0;
}
//欧拉函数:求小于n的与n互质的个数
//欧兰函数公式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数

你可能感兴趣的:(欧拉函数)