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;
}

 

posted on 2015-10-10 19:19  T~Z  阅读(175)  评论(0编辑  收藏  举报