菜鸟就要老老实实重新学起:
euler欧拉函数:
欧拉函数就是小于n的数中与n互质的数的数目。
用法经常比较神奇,数论嘛,还是看能不能想到用出来。
这里的模版参考挑战那本书的。
模版:
//直接求解欧拉函数
long long euler(long long n)
{
long long res=n,a=n;
for(long long i=2;i*i<=a;i++)
if(a%i==0)
{
res=res/i*(i-1);
while(a%i==0) a/=i;
}
if(a>1) res=res/a*(a-1);
return res;
}
//筛选法打欧拉函数表
long long eul[N];
void init()
{
eul[1]=1;
for(long long i=2;i<N;i++)
eul[i]=i;
for(long long i=2;i<N;i++)
if(eul[i]==i)
for(long long j=i;j<N;j+=i)
eul[j]=eul[j]/i*(i-1);
}
eg:
POJ2407 Relatives
http://poj.org/problem?id=2407
题意:
求欧拉函数。思路:
测试模版用code:
#define N 112345
long long n,m;
long long euler(long long n)
{
long long res=n,a=n;
for(long long i=2;i*i<=a;i++)
if(a%i==0)
{
res=res/i*(i-1);
while(a%i==0) a/=i;
}
if(a>1) res=res/a*(a-1);
return res;
}
long long eul[N];
void init()
{
eul[1]=1;
for(long long i=2;i<N;i++)
eul[i]=i;
for(long long i=2;i<N;i++)
if(eul[i]==i)
for(long long j=i;j<N;j+=i)
eul[j]=eul[j]/i*(i-1);
}
int main()
{
int i,j,k,kk,t,x,y,z;
// init();
while(scanf("%lld",&n)!=EOF&&n)
{
printf("%lld\n",euler(n));
}
return 0;
}