pku 2407 Relatives(单独求欧拉函数,模板)

首先要知道 【定理】正整数n(n≥2)可以唯一分解成素数乘积,即:n =p[1]^r1 * p[2] ^r2 * p[3]^r3. *...* p[s]^rs

其次欧拉函数有两个性质,可以用来编程,单独求phi函数:

① Ø(m) =  m ( 1- 1/p[1]) ( 1- 1/p[2])…( 1- 1/p[s])

② Ø(p^k) = p^k – p^(k-1) = (p-1)p^k

下面两种方法就是利用这两个性质。

 

#include <stdio.h>

 

typedef long long LL;

LL phi(LL n)
{
    LL i,sum=n;
    for(i=2; i*i<=n; i++)
    {
        if(n%i==0)
        {
            sum = sum / i * (i-1);
            do
            {
                n/=i;
            }
            while(n%i==0);
        }
    }
    if(n>1) sum = sum / n * (n - 1);
    return sum;
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("tdata.txt","r",stdin);
#endif
    LL n;
    while(scanf("%I64d",&n),n)
    {
        printf("%I64d\n",phi(n));
    }
    return 0;
}

//*******************************************************************

#include <stdio.h>

typedef long long LL;

LL phi(LL n)
{
    LL i,sum=1;
    for(i=2; i*i<=n; i++)
    {
        if(n%i==0)
        {
            sum *= (i-1);
            n /= i;
            while(n%i==0)
            {
                sum *= i;
                n /= i;
            }
        }
    }
    if(n>1) sum *= (n-1);
    return sum;
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("tdata.txt","r",stdin);
#endif
    LL n;
    while(scanf("%I64d",&n),n)
    {
        printf("%I64d\n",phi(n));
    }
    return 0;
}

posted @ 2010-09-11 09:48  菜到不得鸟  阅读(297)  评论(0)    收藏  举报