Cod sursa(job #918556)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 18 martie 2013 22:59:30
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#include <cmath>
#include <vector>
#define pb push_back
#define N 1000000

using namespace std;

int neprim[N+2];
vector<int>divs;
int n, i, x, m, half, conf, prod, j, p, nr[N+2], primes[N+2];
long long rez;

void ciur()
{
    int i, j;
    for(i = 2; i <= N; i++)
    if(!neprim[i])
    {
        neprim[i] = 1;
        primes[++p] = i;
        for(j = 2*i; j <= N; j += i) neprim[j]++;
    }
}

int main()
{
    ifstream fi("pairs.in");
    ofstream fo("pairs.out");
    fi >> n;
    ciur();
    for(i = 1; i <= n; i++)
    {
        fi >> x;
        divs.clear();
        half = sqrt(double(x));
        for(j = 1; j <= p and primes[j] <= half and x; j++)
        {
            if(x%primes[j] == 0) divs.pb(primes[j]);
            while(x%primes[j] == 0) x /= primes[j];
        }
        if(x) divs.pb(x);

        m = divs.size();
        for(conf = 1; conf < (1<<m); ++conf)
        {
            prod = 1;
            for(j = 0; j < m; j++)
                if(((1<<j) & conf) > 0) prod *= divs[j];
            nr[prod]++;
        }
    }
    for(i = 1; i <= N; i++)
    {
        m = neprim[i];
        if(m%2) rez += nr[i]; else rez -= nr[i];
    }
    fo << rez << "\n";
    return 0;
}