Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include<iostream>
- using namespace std;
- const int MAXN = 1e5 + 5;
- const int MAXA = 1e6 + 5;
- long long lcm(int a, int b)
- {
- return (a*1LL*b)/__gcd(a, b);
- }
- int n;
- int a[MAXN];
- vector <int> divs[MAXA];
- void init()
- {
- for(int d = 1;d<MAXA;d++)
- for(int x = d;x<MAXA;x+=d)
- divs[x].push_back(d);
- }
- long long solveSlow()
- {
- long long ans = 0;
- for(int i = 0;i<n;i++)
- for(int j = i+1;j<n;j++)
- ans += lcm(a[i], a[j]);
- return ans;
- }
- long long dp[MAXA];
- long long sum[MAXA], sum2[MAXA];
- long long solveFast()
- {
- for(int i = 0;i<n;i++)
- {
- for(int d: divs[a[i]])
- {
- sum[d] += a[i];
- sum2[d] += a[i]*1LL*a[i];
- }
- }
- for(int d = 1;d<MAXA;d++)
- {
- dp[d] = (sum[d]*sum[d] - sum2[d])/2;
- }
- for(int d = MAXA-1;d>=1;d--)
- {
- for(int k = 2*d;k<MAXA;k+=d)
- dp[d] -= dp[k];
- }
- long long ans = 0;
- for(int d = 1;d<MAXA;d++)
- ans += dp[d]/d;
- return ans;
- }
- int main()
- {
- init();
- cin >> n;
- for(int i = 0;i<n;i++) cin >> a[i];
- cout << "SlowAns = " << solveSlow() << '\n';
- cout << "FastAns = " << solveFast() << '\n';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement