UVa11426 GCD - Extreme (II)

Posted SilverNebula

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)的主要内容,如果未能解决你的问题,请参考以下文章

UVA - 11426 GCD - Extreme (II) (欧拉函数)

UVa11426GCD - Extreme (II)(莫比乌斯反演)

UVa11426 GCD - Extreme (II)

UVA 11426gcd之和 (改编)

UVa11424 GCD - Extreme (I)

UVA11424 GCD - Extreme (I)[数论]