首页 > 代码库 > 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)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。