首页 > 其他 > 详细

UVa11426 GCD - Extreme (II)

时间:2017-01-13 00:14:56      阅读:303      评论:0      收藏:0      [点我收藏+]

见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)

原文:http://www.cnblogs.com/SilverNebula/p/6280378.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!