题目链接:http://www.spoj.com/problems/ETF/
题目大意:T组数据(T<=20000),每组数据给一个n(1<=n<=1e6)要求输出n的欧拉函数的值。
题目分析:筛法求phi即可
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int phi[1100000],prim[1100000],primm=0;
bool mark[1100000];
void getphi()
{
phi[1]=1;
for(int i=2;i<=1000000;i++)
{
if(!mark[i])
{
phi[i]=i-1;
prim[++primm]=i;
}
for(int j=1;j<=primm;j++)
{
int x=prim[j];
if(i*x>1000000)break;
mark[i*x]=1;
if(i%x==0)
{
phi[i*x]=phi[i]*x;
break;
}
else phi[i*x]=phi[i]*phi[x];
}
}
}
int main()
{
int T;
cin>>T;
getphi();
while (T--)
{
int n;
scanf("%d",&n);
printf("%d\n",phi[n]);
}
return 0;
}