Cod sursa(job #1370574)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 3 martie 2015 15:49:37
Problema Pairs Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;

const int Vmax = 1000000 + 1;

int sieve[Vmax];
int use[Vmax];
bool prime[Vmax];
bool valid[Vmax];

int N, M;

int main()
{
    freopen("pairs.in", "r", stdin);
    freopen("pairs.out", "w", stdout);

    scanf("%d", &N);

    for ( int i = 1; i <= N; ++i )
    {
        int a;
        scanf("%d", &a);
        use[a] = 1;
        M = max(M, a);
    }

    for ( int i = 2; i <= M; ++i )
        valid[i] = true;

    for ( int i = 2; i <= M; ++i )
    {
        for ( int j = i + i; j <= M; j += i )
            if ( use[j] )
                use[i]++;

        if ( prime[i] == false )
        {
            sieve[i] = 1;

            for ( int j = i + i; j <= M; j += i )
            {
                prime[j] = true;

                if ( valid[j] )
                {
                    if ( (j / i) % i == 0 )
                        valid[j] = false;

                    sieve[j]++;
                }
            }
        }
    }

    long long sol = 1LL * N * (N - 1) / 2;

    for ( int i = 2; i <= M; ++i )
        if ( valid[i] )
        {
            if ( sieve[i] & 1 )
                sol -= 1LL * use[i] * (use[i] - 1) / 2;
            else
                sol += 1LL * use[i] * (use[i] - 1) / 2;
        }


    printf("%lld\n", sol);

    return 0;
}