欧拉定理:若n,a为正整数,且n,a互质,则有aΦ(n)≡1(mod n),这里Φ(n)为n的欧拉函数。

  费马小定理:ap-1≡1(mod p),p为质数。这里我们发现,费马小定理是欧拉函数的一个特例。

  欧拉函数怎么求呢?

  1)若p为素数,则Φ(p)=p-1;若n=pk,则Φ(n)=pk-pk-1

  2)若n=a*b,且a,b互质,则Φ(n)=Φ(a)*Φ(b)。

  3)对任意n,由以上两条可以推出,n的欧拉函数为所有质因子分解后的欧拉函数的积。

 

#include <cstdio>
#define FOR(i,x,y) for(int i=x;i<=y;++i)
int n,itr,prime[1300];
bool vis[10000];
int qpow(int a,int b)
{
    int base=a,ans=1;
    while(b)
    {
        if(b&1) ans=ans*base;
        base=base*base;
        b>>=1;
    }
    return ans;
}
int euler(int n)
{
    int ans=1,k;
    FOR(i,1,itr)
        if(!(n%prime[i]))
    {
        k=0;
        while((n%prime[i]==0)&&n>1)
        {
            ++k;
            n/=prime[i];
        }
        ans=ans*(qpow(prime[i],k)-qpow(prime[i],k-1));
        if(n==1) break;
    }
    return ans;
}
int main()
{
    FOR(i,2,10000) if(!vis[i])
    {
        prime[++itr]=i;
        FOR(j,2,10000/i) vis[i*j]=true;
    }
    while(scanf("%d",&n)!=EOF)
    {
        printf("%d\n",euler(n));
    }
    return 0;
}