Pagini recente » Cod sursa (job #2035283) | Cod sursa (job #494517) | Cod sursa (job #1207418) | Cod sursa (job #1203749) | Cod sursa (job #100168)
Cod sursa(job #100168)
#include <stdio.h>
#define maxim(a, b) ((a > b) ? a : b)
#define ll long long
#define MAX 1000005
int N, max, uz[MAX], H[MAX];
char primes[MAX];
ll Res;
int main(void)
{
int x, i, j;
freopen("pairs.in", "r", stdin);
freopen("pairs.out", "w", stdout);
scanf("%d", &N);
for (i = 1; i <= N; i++)
{
scanf("%d", &x);
uz[x]++;
if (uz[x] > 1 || x < 2 || x > 1000000) for (;;);
max = maxim(max, x);
}
for (i = 2; i <= max; i++)
primes[i] = 1;
for (i = 2; i <= max; i++)
{
for (j = i+i; j <= max; j+=i)
if (uz[j])
uz[i]++;
if ((int)primes[i])
{
H[i] = 1;
for (j = i+i; j <= max; j+=i)
{
primes[j] = 0;
if (H[j] == -1) continue;
if ((j/i) % i == 0)
H[j] = -1;
else
H[j]++;
}
}
}
Res = (ll)N * (N-1) / 2;
for (i = 2; i <= max; i++)
{
if (H[i] == -1) continue;
if (H[i] % 2)
Res -= (ll)uz[i] * (uz[i]-1) / 2;
else
Res += (ll)uz[i] * (uz[i]-1) / 2;
}
printf("%lld\n", Res);
return 0;
}