首页 > 代码库 > UVa11426 GCD - Extreme (II)

UVa11426 GCD - Extreme (II)

见http://www.cnblogs.com/SilverNebula/p/6280370.html

II的数据范围是I的20倍。

但是做I时用的O(n)+O(nlogn)+O(n)的算法足够了。

没错我就是在水博

/*by SilverN*/#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>#include<cmath>using namespace std;const int mxn=4000005;int read(){    int x=0,f=1;char ch=getchar();    while(ch<0 || ch>9){if(ch==-)f=-1;ch=getchar();}    while(ch>=0 && ch<=9){x=x*10+ch-0;ch=getchar();}    return x*f;}int pri[mxn],cnt=0;long long phi[mxn],f[mxn];void PHI(){    for(int i=2;i<mxn;i++){        if(!phi[i]){            phi[i]=i-1;            pri[++cnt]=i;        }        for(int j=1;j<=cnt && (long long)i*pri[j]<mxn;j++){            if(i%pri[j]==0){                phi[i*pri[j]]=phi[i]*pri[j];                break;            }            else phi[i*pri[j]]=phi[i]*(pri[j]-1);        }    }    return;}int main(){    PHI();    int i,j;    for(i=1;i<mxn;i++){//枚举因数         for(j=i*2;j<mxn;j+=i){            f[j]+=i*phi[j/i];        }    }    for(i=3;i<mxn;i++)f[i]+=f[i-1];    while(1){        i=read();        if(!i)break;        printf("%lld\n",f[i]);    }    return 0;}

 

UVa11426 GCD - Extreme (II)