-
Notifications
You must be signed in to change notification settings - Fork 184
/
Copy path2417.cc
46 lines (44 loc) · 1.02 KB
/
2417.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// https://cses.fi/problemset/task/2417
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e6, K = 1e5;
ll s[N + 1], t[N + 1];
vector<ll> d[N];
int main() {
cin.tie(0), ios::sync_with_stdio();
for (ll i = 2; i <= N; i++)
if (!s[i])
for (ll j = i * 2; j <= N; j += i) s[j] = i;
ll n, x;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> x;
while (x > 1) {
int f = s[x];
if (!f) f = x;
d[i].push_back(f);
while (!(x % f)) x /= f;
}
int k = d[i].size();
for (int j = 1; j < (1 << k); j++) {
int p = 1;
for (int l = 0; l < k; l++)
if (j & (1 << l)) p *= d[i][l];
t[p]++;
}
}
ll ans = 0;
for (int i = 0; i < n; i++) {
int k = d[i].size();
for (int j = 1; j < (1 << k); j++) {
int p = 1;
for (int l = 0; l < k; l++)
if (j & (1 << l)) p *= d[i][l];
if (!__builtin_parity(j)) ans += t[p] - 1;
else
ans -= t[p] - 1;
}
}
cout << (n * (n - 1) / 2) + ans / 2 << '\n';
}