Advertisement
Guest User

Untitled

a guest
May 4th, 2018
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.63 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define CHOR 1000001
  3. #define pb push_back
  4. using namespace::std;
  5.  
  6. typedef long long ll;
  7.  
  8. int lo[CHOR], mu[CHOR], phi[CHOR];
  9. ll f[CHOR];
  10. int zex[10000];
  11. ll ans[CHOR];
  12. bool vis[CHOR];
  13.  
  14. void phi_calc(void)
  15. {
  16. for(int i=1;i<CHOR;i++)
  17. {
  18. lo[i] = i;
  19. mu[i] = 1;
  20. }
  21. for(int i=2;i*i<CHOR;i++)
  22. {
  23. if(lo[i] == i)
  24. {
  25. for(int j=i*i;j<CHOR;j+=i)
  26. {
  27. if(lo[j] == j) lo[j] = i;
  28. }
  29. }
  30. }
  31. //std::cout<<lo[18]<<"\n";
  32. for(int i=2;i<CHOR;i++)
  33. {
  34. int j = i;
  35. while(lo[j/lo[j]] != lo[j]){
  36. j /= lo[j];
  37. }
  38. //std::cout<<i<<" "<<j<<"\n";
  39. if(j != 1)
  40. mu[i] = 0;
  41. else mu[i] = -mu[i/lo[i]];
  42. //std::cout<<mu[i]<<"\n";
  43. }
  44. for(int i=1;i<CHOR;i++)
  45. {
  46. for(int j=i;j<CHOR;j+=i)
  47. phi[j] += (j/i)*mu[i];
  48. }
  49. for(int i=1;i<CHOR;i++)
  50. f[i] = f[i-1] + phi[i];
  51. return;
  52. }
  53.  
  54. int main(void)
  55. {
  56. phi_calc();
  57. int n;
  58. scanf("%d",&n);
  59. int len;
  60. while(n)
  61. {
  62. ll G = 0;
  63. if(vis[n]){
  64. printf("%lld\n",ans[n]);
  65. scanf("%d",&n);
  66. continue;
  67. }
  68. /*
  69. len = 0;
  70. for(int i=1,lx=0;i<=n;i=lx+1)
  71. {
  72. zex[len++]= i;
  73. lx = n/(n/i);
  74. }
  75. for(int i=0;i<len;i++)
  76. {
  77. if(i != len-1)
  78. G += (1LL*(n/zex[i])*(n/zex[i] - 1)/2)*(f[zex[i+1]-1] - f[zex[i]-1]);
  79. else G +=(1LL*(n/zex[i])*(n/zex[i] - 1)/2)*(f[n] - f[zex[i]-1]);
  80. }
  81. */
  82. int last = 1;
  83. int lx = n/(n/1);
  84. for(int i=lx+1;i<=n;i=lx+1)
  85. {
  86. G += (1LL*(n/last)*(n/last - 1)/2)*(f[i-1] - f[last-1]);
  87. lx = n/(n/i);
  88. last = i;
  89. }
  90. G += (1LL*(n/last)*(n/last - 1)/2)*(f[n] - f[last-1]);
  91.  
  92. vis[n] = true;
  93. ans[n] = G;
  94. printf("%lld\n",G);
  95. scanf("%d",&n);
  96. }
  97. return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement