E.cpp 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. //
  2. // Created by jal on 2019-05-01.
  3. //
  4. #include <bits/stdc++.h>
  5. using namespace std;
  6. vector<int>primes = {2,3,5};
  7. vector<int>phi;
  8. void init(int n){
  9. for(int i = primes.back()+2; i <= n; i+= 2){
  10. bool flag = true;
  11. for(auto p : primes){
  12. if(p * p > i)break;
  13. if(i % p == 0){
  14. flag = false;
  15. break;
  16. }
  17. }
  18. if(flag)primes.push_back(i);
  19. }
  20. }
  21. void genPhi(int max){
  22. int minDiv[max];
  23. for(int i = 1; i < max; i++){
  24. minDiv[i] = i;
  25. }
  26. for(int i = 2; i * i < max; i++){
  27. if(minDiv[i] == i){
  28. for(int j = i*i; j < max; j += i){
  29. minDiv[j] = i;
  30. }
  31. }
  32. }
  33. phi[1] = 1;
  34. for(int i = 2; i < max; i++){
  35. phi[i] = phi[i / minDiv[i]];
  36. if((i / minDiv[i]) % minDiv[i] == 0){
  37. phi[i] *= minDiv[i];
  38. }else{
  39. phi[i] *= minDiv[i] - 1;
  40. }
  41. }
  42. }
  43. int main(){
  44. int n;
  45. cin >> n;
  46. init(n);
  47. phi.resize(n+1);
  48. genPhi(n+1);
  49. vector<long long> sum(n/2+1, 0);
  50. for(int i = 1; i <= n/2; i++){
  51. sum[i] = sum[i-1] + phi[i];
  52. }
  53. long long cnt = 0;
  54. for(auto i : primes){
  55. cnt += phi[1];
  56. if(n / i != 1){
  57. cnt += 2 * (sum[n/i] - phi[1]);
  58. }
  59. }
  60. cout << cnt << endl;
  61. }