Cod sursa(job #918587)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 18 martie 2013 23:50:10
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
#include <iostream>
#include <cmath>
#include <vector>
#define pb push_back
#define N 1000000

using namespace std;

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

void descompune(int x)
{
    if(x == 1) return;
    if(gd[x] != last) divs.pb(gd[x]);
    last = gd[x];
    descompune(x/gd[x]);
}

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

int main()
{
    ifstream fi("pairs.in");
    ofstream fo("pairs.out");
    fi >> n;
    ciur();
    for(i = 1; i <= n; i++)
    {
        fi >> x;
        divs.clear();
        last = 0;
        descompune(x);

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