Pagini recente » Cod sursa (job #2297356) | Cod sursa (job #243653) | Cod sursa (job #202438) | Cod sursa (job #654491) | Cod sursa (job #485963)
Cod sursa(job #485963)
#include <cstdio>
#define MAX 1000000
#define PMAX 1000000
#define QMAX 1000000
int P[PMAX], PM[MAX], Q[QMAX], QF[QMAX], viz[MAX], NQ, x, y, i, j, u, max, vmax;
long long A[MAX], n, t, sol;
int main () {
freopen ("pairs.in", "r", stdin);
freopen ("pairs.out", "w", stdout);
for (i = 2; i * i <= MAX; i++)
if (!P[i]) {
P[++P[0]] = i;
for (j = 2 * i; j * j <= MAX; j += i)
P[j] = 1;
}
scanf ("%lld", &n);
for (i = 1; i <= n; i++) {
scanf ("%d", &x);
viz[x] = 1;
if (x > vmax) vmax = x;
y = x;
for (j = 1; P[j] * P[j] <= x && j <= P[0] && y != 1; j++)
if (y % P[j] == 0) {
if (P[j] > max) max = P[i];
while (y % P[j] == 0)
y /= P[j];
}
if (y != 1) {
if (y > max) max = y;
if ((long long) y * (long long) y > MAX)
PM[++PM[0]] = y;
}
}
for (i = 2; i <= MAX; i++)
for (j = 1; j <= MAX / i; j++)
if (viz[i * j])
A[i]++;
sol = n * (n - 1) / 2LL;
Q[0] = 1, NQ = 0;
for (i = 1; i <= P[0] && P[i] <= max; i++) {
u = NQ;
for (j = 0; j <= u; j++) {
x = P[i] * Q[j];
if (x <= vmax) {
NQ++, Q[NQ] = x, QF[NQ] = QF[j] + 1;
t = A[Q[NQ]] * (A[Q[NQ]] - 1) / 2LL;
if (QF[NQ] % 2)
sol -= t;
else
sol += t;
}
}
}
for (i = 1; i <= PM[0]; i++) {
u = NQ;
for (j = 0; j <= u; j++) {
x = PM[i] * Q[j];
if (x <= vmax) {
NQ++, Q[NQ] = x, QF[NQ] = QF[j] + 1;
t = A[Q[NQ]] * (A[Q[NQ]] - 1) / 2LL;
if (QF[NQ] % 2)
sol -= t;
else
sol += t;
}
}
}
printf ("%lld", sol);
return 0;
}