Cod sursa(job #1398971)

Utilizator Stefex09Stefan Teodorescu Stefex09 Data 24 martie 2015 14:39:52
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <iostream>
#include <fstream>
#include <bitset>

using namespace std;

ifstream in ("pairs.in");
ofstream out ("pairs.out");

const int MAX = 1000000 + 10;

bitset <MAX> NotPrime;//NotPrime[i] = 1 daca i NU este prim
bitset <MAX> Use;//daca se gaseste in multimea M
bitset <MAX> Bad;//daca in descompunerea lui i apare un factor prim la putere > 1, atunci Bad[i] = 1
int NrDiv[MAX];

int main()
{
    int N, Max = 0, i, x, j;

    in >> N;
    for (i = 1; i <= N; i ++){
        in >> x;

        Use[x] = 1;
        if (x > Max)
            Max = x;
    }

    for (i = 2; i <= Max; i ++)
        if (!NotPrime[i]){
            for (j = i; j <= MAX; j += i){
                NrDiv[j] ++;
                NotPrime[j] = 1;

                if (j % (i * i) == 0)
                    Bad[j] = 1;
            }
        }

    long long Ans = 0;
    int now;

    for (i = 2; i <= Max; i ++)
        if (!Bad[i]){
            now = 0;

            for (j = i; j <= Max; j += i)
                now += Use[j];

            if (NrDiv[i] % 2 == 0)
                Ans -= (1LL * now * (now - 1) / 2);
            else
                Ans += (1LL * now * (now - 1) / 2);
        }

    Ans = 1LL * N * (N - 1) / 2 - Ans;
    out << Ans;

    return 0;
}