Cod sursa(job #1370572)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 3 martie 2015 15:48:47
Problema Pairs Scor 40
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()
{
    ifstream in("pairs.in");
    ofstream out("pairs.out");

    ios_base::sync_with_stdio(false);

    in >> N;

    for ( int i = 1; i <= N; ++i )
    {
        int a;
        in >> 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;
        }


    out << sol << "\n";

    return 0;
}