UVa11426 GCD

见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
",f[i]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/SilverNebula/p/6280378.html