Cod sursa(job #120300)

Utilizator DastasIonescu Vlad Dastas Data 4 ianuarie 2008 20:39:20
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 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;
char x[maxp];
int primes[maxp];

int maxnr = -1;

void ciur()
{
    primes[++k] = 2;

    for ( int i = 4; i <= maxp; i += 2 )
        x[i] = 'x';

    for ( int i = 3; i <= maxp; i += 2 )
        if ( x[i] != 'x' )
        {
            primes[++k] = i;

            for ( int j = i+i; j <= maxp; j += i )
                x[j] = 'x';
        }
}

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;

    int nrp = 0;
    int tmp = 0;
    int ee = 0;
    int ok = 1;

    for ( int i = 2; i*i <= maxnr; ++i )
        e[i*i] = -1;

    for ( int i = 2; i <= maxnr; ++i )
        if ( e[i] != -1 )
        {
            ok = 1;
            tmp = i;

            nrp = 0;

            for ( int j = 1; primes[j]*primes[j] <= i; ++j )
            {
                ee = 0;
                int tt =  primes[j];
                if ( tmp % tt == 0 )
                {
                    ++nrp;
                    while ( tmp % tt == 0 )
                        tmp /= tt, ++ee;

                    if ( ee > 1 )
                    {
                        ok = 0;
                        break;
                    }
                }
            }

            if ( tmp > 1 )
                ++nrp;

            if ( ok )
            {
                if ( (nrp & 1) == 0 )
                    res = res - (long long)(h[i]*(h[i] - 1) / 2);
                else
                    res = res + (long long)(h[i]*(h[i] - 1) / 2);
            }
        }

    return res;
}

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

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

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

	return 0;
}