Pagini recente » Cod sursa (job #1232892) | Cod sursa (job #2618871) | Cod sursa (job #737078) | Cod sursa (job #1879262) | Cod sursa (job #2305005)
#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;
void mark(int lvl, int prod) {
if (lvl == vf) {
freq[prod]++;
return;
}
mark(lvl + 1, prod * st[lvl]);
mark(lvl + 1, prod);
}
void back(int lvl, int prod, int f) {
if (lvl == vf) {
if (!f)
return;
if (f)
rs += freq[prod] - 1;
else rs -= freq[prod] - 1;
return;
}
back(lvl + 1, prod * st[lvl], f + 1);
back(lvl + 1, prod, f);
}
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;
mark(0, 1);
}
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];
back(0, 1, 0);
}
out << ((ll) n * ((ll) n - 1LL) - rs) / 2LL;
return 0;
}