记录编号 498388 评测结果 AAAAAAAAAA
题目名称 [UVa 11426] 最大公约数之和——极限版II 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 0.479 s
提交时间 2018-06-13 16:58:50 内存使用 81.92 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int maxn=4000005;
  6. void phi_table(int);
  7. bool notp[maxn];
  8. long long sp[maxn],s[maxn];
  9. int n,phi[maxn],prime[maxn/10];
  10. int main(){
  11. freopen("gcd_extreme.in","r",stdin);
  12. freopen("gcd_extreme.out","w",stdout);
  13. phi_table(4000000);
  14. while(scanf("%d",&n)==1&&n){
  15. long long ans=0;
  16. for(int i=1,last;i<=n;i=last+1){
  17. last=n/(n/i);
  18. ans+=(s[last]-s[i-1])*sp[n/i];
  19. }
  20. printf("%lld\n",ans);
  21. }
  22. return 0;
  23. }
  24. void phi_table(int n){
  25. for(int i=2;i<=n;i++){
  26. if(!notp[i]){
  27. prime[++prime[0]]=i;
  28. phi[i]=i-1;
  29. }
  30. for(int j=1;j<=prime[0]&&i*prime[j]<=n;j++){
  31. notp[i*prime[j]]=true;
  32. if(i%prime[j])phi[i*prime[j]]=phi[i]*(prime[j]-1);
  33. else{
  34. phi[i*prime[j]]=phi[i]*prime[j];
  35. break;
  36. }
  37. }
  38. }
  39. for(int i=1;i<=n;i++){
  40. s[i]=s[i-1]+i;
  41. sp[i]=sp[i-1]+phi[i];
  42. }
  43. }