Cod sursa(job #120298)

Utilizator DastasIonescu Vlad Dastas Data 4 ianuarie 2008 20:29:09
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <cstdio>

const int maxn = 1000001;
const int maxp = 2000;

FILE *in = fopen("pairs.in","r"), *out = fopen("pairs.out","w");

int n;

int k;

int w[maxn]; // w[i] = 1 daca i se aduna
             //      = 2 daca i se scade
             //      = -1 daca i nu e bun
int x[maxn]; // x[i] = 0 daca i e prim, 1 altfel

int maxnr = -1;

void ciur()
{
    int end = 0;

    for ( int i = 2; i <= maxnr; ++i )
        if ( !x[i] )
        {
            for ( int j = i; j <= maxnr; j += i )
            {
                ++w[j], x[j] = 1;

                if ( w[j] == 3 )
                    w[j] = 1;
            }
            if ( !end )
            {
                if ( i*i <= maxnr )
                    w[i*i] = -1;
                else
                    end = 1;
            }
        }
        else
        {
            for ( int j = i+i; j <= maxnr; j += i )
                w[j] = -1;
        }
}

int e[maxn];
int h[maxn];

void read()
{
    fscanf(in, "%d", &n);

    int x = 0;
    for ( int i = 1; i <= n; ++i )
        fscanf(in, "%d", &x), ++e[ x ], x > maxnr ? maxnr = x : 1;
}

void calch()
{
    for ( int i = 1; i <= maxnr; ++i )
        for ( int j = i; j <= maxnr; j += i )
            if ( e[j] )
                ++h[i];
}

long long count()
{
    long long res = 0;

    for ( int i = 2; i <= maxnr; ++i )
        if ( w[i] == 1 )
            res = res + (h[i]*(h[i]-1)/2);
        else if ( w[i] == 2 )
            res = res - (h[i]*(h[i]-1)/2);

    return res;
}


int main()
{
    read();
    calch();
    ciur();

    long long cnt = (long long)n*(n-1)/2;

    fprintf(out, "%lld\n", cnt - count());

	return 0;
}