Cod sursa(job #116799)

Utilizator astronomyAirinei Adrian astronomy Data 19 decembrie 2007 16:01:08
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <cstdio>
#include <cstring>
using namespace std;

#define MAXN 1000100
#define llong long long
#define clear(a) (memset(a, 0, sizeof(a)))

int N, cnt[MAXN], Nr[MAXN];
char ok[MAXN], bad[MAXN];
llong res;

void ruleaza(void)
{
    int i, j, k;

    scanf("%d ", &N);
    for(i = 1; i <= N; i++) scanf("%d ", &j), ok[j] = 1;

    for(i = 2; i < MAXN; i++)
     for(j = i; j < MAXN; j+=i)
      cnt[i] += ok[j];

    for(clear(ok), i = 2; i < MAXN; i++)
     if(!ok[i])
      for(j = i, k = i*i; j < MAXN; j+=i)
        Nr[j]++, ok[j] = 1, bad[j] = (j%k == 0);

    for(res = (llong)N*(N-1)/2, i = 2; i < MAXN; i++)
     if(!bad[i])
        res = res + (llong)cnt[i]*(cnt[i]-1)/2*(Nr[i]&1?-1:1);

    printf("%lld\n", res);
}

int main(void)
{
    freopen("pairs.in", "rt", stdin);
    freopen("pairs.out", "wt", stdout);

    ruleaza();

    return 0;
}