Cod sursa(job #2305145)

Utilizator ValentinSavoiuFMI Savoiu Valentin-Marian ValentinSavoiu Data 19 decembrie 2018 14:09:38
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#define MILLION 1000000
using namespace std;
ifstream f("pairs.in");
ofstream g("pairs.out");

int N, x, v[11], l, prime[201], nrPrime, i, j;
int divisibleWith[MILLION + 1];
long long res, nr;

void find_primes() {
    bool sieve[1001] = {false};
    for (int i = 2; i * i < 1000; ++i) {
        if (sieve[i] == 1) continue;
        for (int j = i * i; j <= 1000; j += i)
            sieve[j] = 1;
    }
    for (int i = 2; i < 1000; ++i)
        if (sieve[i] == 0)
            prime[++nrPrime] = i;

}

void prime_decomposition(int x, int v[], int &l) {
    l = 0;
    for (int i = 1; prime[i] * prime[i] <= x && i <= nrPrime; ++i) {
        if (x % prime[i] == 0) {
            v[++l] = prime[i];
            while (x % prime[i] == 0)
                x /= prime[i];
        }
    }
    if (x != 1) v[++l] = x;
}

long long pinex(int v[], int l) {
    long long sol = 0;
    int Max = 1 << l;
    for (int i = 1; i < Max; ++i) {
        int sign = -1, prod = 1;
        for (int j = 0; j < l; ++j)
            if (i & (1 << j) ) {
                prod *= v[j + 1];
                sign *= -1;
            }
        sol += sign * divisibleWith[prod];
        divisibleWith[prod]++;
    }
    return sol;
}
int main() {
    f >> N;
    nrPrime = 0;
    find_primes();
    for (i = 1; i <= N; ++i) {
        f >> x;
        prime_decomposition(x, v, l);
        nr = pinex (v, l);
        res = res + (i - 1) - nr;
    }
    g << res;
    return 0;
}