Cod sursa(job #1346131)

Utilizator pop_bogdanBogdan Pop pop_bogdan Data 18 februarie 2015 01:31:46
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
using namespace std;

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

int M, x, maxim(-1);

bool Ap[1000001]; // x apare in multime daca Ap[x] = 1
bool notPrime[1000001]; // x nu este prim daca notPrime[x] = 1
bool notGord[1000001]; // daca notGord[x] = 1 atunci puterea unui factor prim al lui x este diferita de 1
int nrF[1000001]; // nrF[x] - cati factori primi distincti are x

int main()
{
    is >> M;
    for ( int i = 1; i <= M; ++i )
    {
        is >> x;
        maxim = max(maxim,x);

        Ap[x] = 1;
    }

    for ( int i = 2; i <= maxim; ++i )
    {
        if ( !notPrime[i] )
        {
            for ( int j = i * 2; j <= maxim; j += i )
            {
                nrF[j]++;
                notPrime[j] = 1;
                if ( j % (i*i) == 0 )
                    notGord[j] = 1;
            }
        }
    }

    int nr(0);
    int Sol(0);
    for ( int i = 2; i <= maxim; ++i )
    {
        if ( notGord[i] == 0 )
        {
            nr = 0;
            for ( int j = i;j <= maxim; j += i )
                if ( Ap[j] == 1 )
                    nr++;
            if ( nrF[i] % 2 == 0 )
                Sol += (nr*(nr-1)/2);
            else
                Sol -= (nr*(nr-1)/2);
        }
    }
    os << (M*(M-1))/2 - Sol;
    is.close();
    os.close();
}