Advertisement
stoyan_malinin

Untitled

Sep 8th, 2021
384
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.27 KB | None | 0 0
  1. #include <algorithm>
  2. #include<iostream>
  3.  
  4. using namespace std;
  5.  
  6. const int MAXN = 1e5 + 5;
  7. const int MAXA = 1e6 + 5;
  8.  
  9. long long lcm(int a, int b)
  10. {
  11.     return (a*1LL*b)/__gcd(a, b);
  12. }
  13.  
  14. int n;
  15. int a[MAXN];
  16.  
  17. vector <int> divs[MAXA];
  18.  
  19. void init()
  20. {
  21.     for(int d = 1;d<MAXA;d++)
  22.         for(int x = d;x<MAXA;x+=d)
  23.             divs[x].push_back(d);
  24. }
  25.  
  26. long long solveSlow()
  27. {
  28.     long long ans = 0;
  29.     for(int i = 0;i<n;i++)
  30.         for(int j = i+1;j<n;j++)
  31.             ans += lcm(a[i], a[j]);
  32.  
  33.     return ans;
  34. }
  35.  
  36. long long dp[MAXA];
  37. long long sum[MAXA], sum2[MAXA];
  38.  
  39. long long solveFast()
  40. {
  41.     for(int i = 0;i<n;i++)
  42.     {
  43.         for(int d: divs[a[i]])
  44.         {
  45.             sum[d] += a[i];
  46.             sum2[d] += a[i]*1LL*a[i];
  47.         }
  48.     }
  49.  
  50.     for(int d = 1;d<MAXA;d++)
  51.     {
  52.         dp[d] = (sum[d]*sum[d] - sum2[d])/2;
  53.     }
  54.  
  55.     for(int d = MAXA-1;d>=1;d--)
  56.     {
  57.         for(int k = 2*d;k<MAXA;k+=d)
  58.             dp[d] -= dp[k];
  59.     }
  60.  
  61.     long long ans = 0;
  62.     for(int d = 1;d<MAXA;d++)
  63.         ans += dp[d]/d;
  64.  
  65.     return ans;
  66. }
  67.  
  68. int main()
  69. {
  70.     init();
  71.  
  72.     cin >> n;
  73.     for(int i = 0;i<n;i++) cin >> a[i];
  74.  
  75.     cout << "SlowAns = " << solveSlow() << '\n';
  76.     cout << "FastAns = " << solveFast() << '\n';
  77. }
  78.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement