poj2478--欧拉函数打表
此题中对时间有要求,如直接使用欧拉函数求解,每输入一个n,就得进行循环求出<n的每个数的欧拉函数,
这样会超时,
于是我们可预先将欧拉函数打表,
再进行一个循环加法运算,便可不超时得解。
#include<iostream> #define Max 1000001 using namespace std; //欧拉函数打表 long long euler[Max]; void Init(){ euler[1]=1; for(int i=2;i<Max;i++) euler[i]=i; for(int i=2;i<Max;i++) if(euler[i]==i) for(int j=i;j<Max;j+=i) euler[j]=euler[j]/i*(i-1); } int main(){ long long n,sum; Init(); while(cin>>n,n){ sum=0; for(int i=2;i<=n;i++){ sum+=euler[i]; } cout<<sum<<endl; } return 0; }