Pagini recente » Cod sursa (job #2054348) | Cod sursa (job #2989680) | Cod sursa (job #830897) | Cod sursa (job #3261043) | Cod sursa (job #108628)
Cod sursa(job #108628)
Utilizator |
Mircea Pasoi domino |
Data |
23 noiembrie 2007 02:05:56 |
Problema |
Pairs |
Scor |
Ascuns |
Compilator |
cpp |
Status |
done |
Runda |
|
Marime |
1.1 kb |
#include <stdio.h>
#include <string.h>
#define MAX_VAL 1000005
#define FIN "pairs.in"
#define FOUT "pairs.out"
#define INF 0x3f3f3f3f
#define ll long long
int N, cnt[MAX_VAL], P[MAX_VAL], exp[MAX_VAL];
char ok[MAX_VAL]; ll Res;
int main(void)
{
int i, j, x;
freopen(FIN, "r", stdin);
freopen(FOUT, "w" ,stdout);
scanf("%d", &N);
for (i = 0; i < N; ++i)
{
scanf("%d", &x);
for (j = 1; j*j <= x; ++j)
{
if (x%j) continue;
cnt[j]++; cnt[x/j]++;
}
}
Res = (ll)N*N;
memset(P, 0x3f, sizeof(P));
for (ok[1] = 1, i = 2; i < MAX_VAL; ++i)
{
if (P[i] == INF) P[i] = i;
if (i%P[i] == 0 && (i/P[i])%P[i] && ok[i/P[i]])
{
ok[i] = 1;
exp[i] = 1^exp[i/P[i]];
if (exp[i]&1)
Res -= (ll)cnt[i]*cnt[i];
else
Res += (ll)cnt[i]*cnt[i];
}
for (j = 2*i; j < MAX_VAL; j += i)
if (P[j] == INF) P[j] = P[i];
}
printf("%lld\n", Res/2);
return 0;
}