Cod sursa(job #108630)

Utilizator dominoMircea Pasoi domino Data 23 noiembrie 2007 03:16:20
Problema Pairs Scor Ascuns
Compilator cpp Status done
Runda Marime 1.09 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
#define min(a, b) ((a) < (b) ? (a) : (b))

int N, cnt[MAX_VAL];
char P[MAX_VAL], bad[MAX_VAL], exp[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);
        cnt[x]++;
    }
    
    Res = (ll)N*(N-1)/2;
    for (i = 2; i < MAX_VAL; ++i)
    {
        for (j = 2*i; j < MAX_VAL; j += i)
            cnt[i] += cnt[j];
        if (!P[i])
        {
            exp[i] = 1;
            for (j = 2*i; j < MAX_VAL; j += i)
            {
                P[j] = 1;
                if ((j/i)%i == 0) bad[j] = 1;
                exp[j] ^= 1;
            }
        }
        if (bad[i]) continue;
        if (!exp[i])
            Res += (ll)cnt[i]*(cnt[i]-1)/2;
        else
            Res -= (ll)cnt[i]*(cnt[i]-1)/2;
    }
    printf("%lld\n", Res);

    return 0;
}