Cod sursa(job #100168)

Utilizator filipbFilip Cristian Buruiana filipb Data 11 noiembrie 2007 22:27:51
Problema Pairs Scor Ascuns
Compilator cpp Status done
Runda Marime 1.32 kb
#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;
}