我的第一道欧拉函数题,题目虽水,但是还是值得纪念一下的,呵呵
这里要说明一个问题:对于一个整数,它最多有一个最大因子超过它的平方根;
比如说吧,10的平方根是3,它只有一个比3大的因子5,原因是很简单,只是看自己有没有想到;
这个没想清楚让我奉献了一次MLE,呵呵...
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int MAXN = 100000;
int prim[MAXN];
void prime(int n) //小于n的素数
{
int i,j,k,num,x,*b;
n++;
n/=2;
b=(int *)malloc(sizeof(int)*(n+1)*2);
prim[0]=2;
prim[1]=3;
num=2;
for(i=1; i<=2*n; i++)b[i]=0;
for(i=3; i<=n; i+=3)
for(j=0; j<2; j++)
{
x=2*(i+j)-1;
while(b[x]==0)
{
prim[num++]=x;
for(k=x; k<=2*n; k+=x)
b[k]=1;
}
}
}
long long phi(long long n)
{
long m=n;
int i=0;
long long sum = n;
while(prim[i]*prim[i]<=n&& m!=1 )
{
if(m%prim[i]==0) sum=sum/prim[i]*(prim[i]-1);
while(m%prim[i]==0&& m!=1)
{
m=m/prim[i];
}
i++;
}
if(m!=1)sum=sum/m*(m-1);
return sum;
}
int main()
{
prime(MAXN);
long long n;
while(scanf("%lld",&n)&&n)
{
printf("%lld\n",phi(n));
}
return 0;
}