ACM PKU 2407 Relatives
我的第一道欧拉函数题,题目虽水,但是还是值得纪念一下的,呵呵
这里要说明一个问题:对于一个整数,它最多有一个最大因子超过它的平方根;
比如说吧,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; }