Pagini recente » Rating Graur Maria (mgraur) | Cod sursa (job #993342) | Cod sursa (job #754332) | Cod sursa (job #2564014) | Cod sursa (job #2304997)
#include <bits/stdc++.h>
#define ll long long
#pragma GCC optimize("03")
using namespace std;
ifstream in("pairs.in");
ofstream out("pairs.out");
int n, a[100100], st[100], vf, freq[1000100], prim[200100], tp;
ll rs;
bitset <1000100> viz;
int main() {
for (int i = 2; i * i <= 1000000; i++)
if (!viz[i])
for (int j = i + i; j <= 1000000; j += i)
viz[j] = 1;
for (int i = 2; i <= 1000000; i++)
if (!viz[i])
prim[++tp] = i;
in >> n;
for (int i = 1; i <= n; i++)
in >> a[i];
for (int i = 1; i <= n; i++) {
int nr = a[i];
vf = 0;
for (int j = 1; prim[j] * prim[j] <= nr; j++) {
if (nr % prim[j])
continue;
st[vf++] = prim[j];
while (nr % prim[j] == 0)
nr /= prim[j];
}
if (nr > 1)
st[vf++] = nr;
for (int mask = 1; mask < (1 << vf); mask++) {
int num = 1;
for (int bit = 0; bit < vf; bit++)
if (mask & (1 << bit))
num *= st[bit];
freq[num]++;
}
}
for (int i = 1; i <= n; i++) {
vf = 0;
for (int j = 1; prim[j] * prim[j] <= a[i]; j++) {
if (a[i] % prim[j])
continue;
st[vf++] = prim[j];
while (a[i] % prim[j] == 0)
a[i] /= prim[j];
}
if (a[i] > 1)
st[vf++] = a[i];
for (int mask = 1; mask < (1 << vf); mask++) {
int num = 1, cnt = 0;
for (int bit = 0; bit < vf; bit++)
if (mask & (1 << bit)) {
num *= st[bit];
cnt++;
}
if (cnt & 1)
rs += freq[num] - 1;
else rs -= freq[num] - 1;
}
}
out << ((ll) n * ((ll) n - 1LL) - rs) / 2LL;
return 0;
}