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;
- 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 += (__gcd(a[i], a[j])==1);
- return ans;
- }
- long long dp[MAXA];
- int cntDiv[MAXA];
- long long solveFast()
- {
- for(int i = 0;i<n;i++)
- for(int d: divs[a[i]])
- cntDiv[d]++;
- for(int d = 1;d<MAXA;d++)
- {
- dp[d] = (cntDiv[d]*1LL*(cntDiv[d]-1))/2;
- }
- for(int d = MAXA-1;d>=1;d--)
- {
- for(int k = 2*d;k<MAXA;k+=d)
- dp[d] -= dp[k];
- }
- return dp[1];
- }
- 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