这是一道裸的欧拉函数的题目!题意很简单,就是求1到n-1之间与n互质的个数,很明显用欧拉函数解决,但欧拉函数有两种编程方法!
/*==================================================*\
|递推求欧拉函数phi(i)
\*==================================================*/
for(i=1; i<maxn; i++) a[i]=i;
for(i=2; i<maxn;i+=2)a[i]/=2;
for(i=3; i<maxn; i+=2)
{
if(a[i]==i)
{
for(j=i; j<maxn; j+=i)
a[j]=a[j]/i*(i-1);
}
}
不过我看到有人时这样写的,差不多,不过这样更简洁!
for(i=1; i<maxn; i++) a[i]=i;
for(i=2; i<maxn; i++)
{
if(a[i]==i)
{
for(j=i; j<maxn; j+=i)
a[j]=a[j]/i*(i-1);
}
}
//
我觉得这种就是求n到m之间的总的 满足欧拉函数的总个数!
另外一种就是
int euler(int x)
{
int res=x,i;
for(i=2; i<=(int)sqrt(x*1.0)+1; i++)
{ if(x%i==0)
res=res/i*(i-1);
while(x%i==0)
x/=i;
}
if(x>1)
res=res/x*(x-1);
return res;
}
而这种就是求(1到(n-1))与n互质的个数!
这题AC代码:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int euler(int x)
{
int i,res=x;
for(i=2; i<=(int)sqrt(x*1.0)+1; i++)
{
if(x%i==0)
{
res=res/i*(i-1);
while(x%i==0)
{
x/=i;
}
}
}
if(x>1)res=res/x*(x-1);
return res;
}
int main()
{
int t,n;
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
scanf("%d",&n);
printf("%d\n",euler(n));
}
}
return 0;
}