Pagini recente » Cod sursa (job #2451540) | Cod sursa (job #904546) | Cod sursa (job #2095791) | Cod sursa (job #1325672) | Cod sursa (job #226846)
Cod sursa(job #226846)
#include <cstdio>
#include <vector>
using namespace std;
int n, i, j, nrd[1000000], st[17], v, nrf[100100], pr[100100], c[1000100], m;
int fact[100100][17];
long long r, tot;
void ciur() {
int i, j;
for (i = 2; i * i < 1000000; i++)
if (c[i] == 0)
for (j = 2; j * i <= 1000000; j++)
c[i * j] = 1;
c[1] = 1;
for (i = 2; i < 1000000; i++)
if (c[i] == 0) {
pr[0]++;
pr[pr[0]] = i;
}
}
void desc(int n) {
int d;
for (d = 1; d * d <= n; d++) {
if (n % d == 0) {
nrd[d]++;
if (d != (n / d))
nrd[n / d]++;
}
}
for (d = 1; d <= pr[0] && pr[d] * pr[d] <= n; d++)
if (n % pr[d] == 0) {
nrf[i]++;
fact[i][nrf[i]] = pr[d];
while (n % pr[d] == 0)
n /= pr[d];
}
if (n > 1) {
nrf[i]++;
fact[i][nrf[i]] = n;
}
}
int barbut(int n) {
memset(st, 0, sizeof(st));
int i, j, nr1, sum = 0, pr;
for (i = 0; i < (1 << nrf[n]); i++) {
pr = 1; nr1 = 0;
for (j = 1; j <= nrf[n]; j++)
if (st[j] == 1) {
pr *= fact[n][j];
nr1++;
}
if (nrd[pr])
if (nr1 & 1)
sum += (nrd[pr] - 1);
else
sum -= (nrd[pr] - 1);
j = nrf[n];
while (st[j] == 1 && j) {
st[j] = 0;
j--;
}
st[j] = 1;
}
return sum;
}
int main() {
freopen("pairs.in", "r", stdin);
freopen("pairs.out", "w", stdout);
scanf("%d", &n);
ciur();
tot = (1LL * n * (n - 1));
for (i = 1; i <= n; i++) {
scanf("%d", &v);
if (v > m)
m = v;
desc(v);
}
nrd[1] = 0;
for (i = 1; i <= n; i++)
tot -= barbut(i);
printf("%lld\n", tot / 2);
return 0;
}