欧拉定理:若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;
}
浙公网安备 33010602011771号