小于n且与n互素的个数
#include <stdio.h>
#include<math.h>
#include <algorithm>
int phi[10005];
int n;
void Euler()
{
int MAX=1005;
int i,j;
memset(phi,0,sizeof(phi));
phi[1]=1;
for(i=2;i<MAX;i++)
{
if(!phi[i])
{
for(j=i;j<MAX;j+=i)
{
if(!phi[j])phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
}
}
return;
}
int main()
{
phi[1]=1;
Euler();
while(~scanf("%d",&n))
{
int ans=n;
int p=n;
int m=(int)sqrt(n+0.5);
for(int i=2;i<=m;i++)
if(!(n%i))
{
ans=ans/i*(i-1);
while(n%i==0)n/=i;
}
if(n>1) ans=ans/n*(n-1);
printf("%d %d\n",ans,phi[p]);
}
}
两种求法 单独求某个数的欧拉函数值
或者是求一段(1-n)的欧拉函数值