码迷,mamicode.com
首页 > 其他好文 > 详细

UVa11426 GCD - Extreme (II)

时间:2017-01-13 00:15:43      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:http   bre   while   ret   getchar   read   const   std   phi   

见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   bre   while   ret   getchar   read   const   std   phi   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!