Cod sursa(job #1567371)

Utilizator Burbon13Burbon13 Burbon13 Data 13 ianuarie 2016 10:24:12
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <cstdio>
#include <cstring>

using namespace std;

const int nmx = 1000002;
const int pmx = 80000;

int n,prim[pmx],MAX;
bool viz[nmx];

void ciur() {
    prim[0] = 1;
    prim[1] = 2;
    for(int i = 3; i <= nmx; i += 2)
        if(not viz[i]) {
            prim[++prim[0]] = i;
            for(int j = 2 * i; j <= nmx; j += i)
                viz[j] = true;
        }
}

void input() {
    scanf("%d", &n);
    memset(viz,0,sizeof(viz));
    int nr;
    for(int i = 1; i <= n; ++i) {
        scanf("%d", &nr);
        MAX = MAX < nr ? nr : MAX;
        viz[nr] = true;
    }
}

int descompunere(int nr) {
    int total = 0;
    for(int i = 1; prim[i] * prim[i] <= nr; ++i)
        if(nr % prim[i] == 0) {
            ++ total;
            nr /= prim[i];

            if(nr % prim[i] == 0)
                return -1;
        }
    if(nr > 1)
        ++ total;
    return total;
}

void principiu() {
    int t,pos,nrfac;
    long long total = (n * (n-1)) / 2;

    nrfac = descompunere(2);
    t = 0;
    pos = 2;
    while(pos <= MAX) {
        if(viz[pos])
            ++ t;
        pos += 2;
    }
    if(nrfac % 2 == 1)
        total -= (long long)(t * (t-1)) / 2;
    else
        total += (long long)(t * (t-1)) / 2;

    for(int i = 3; i <= MAX; i += 2) {
        nrfac = descompunere(i);
        if(nrfac == -1)
            continue;
        t = 0;
        pos = i;
        while(pos <= MAX) {
            if(viz[pos])
                ++ t;
            pos += i;
        }

        if(nrfac % 2 == 1)
            total -= (long long)(t * (t-1)) / 2;
        else
            total += (long long)(t * (t-1)) / 2;
    }
    printf("%d\n", total);
}

int main() {
    freopen("pairs.in", "r", stdin);
    freopen("pairs.out", "w", stdout);

    ciur();

    input();

    principiu();

    return 0;
}