Cod sursa(job #1453166)

Utilizator lflorin29Florin Laiu lflorin29 Data 22 iunie 2015 19:37:04
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <stdio.h>
#include <set>
#include <vector>
#include <time.h>
#include <stdlib.h>
#define szs(x) ((int)(x).size())
#define i64 long long
#define vk (1 << 24)
#define dmax 1005
#define pb push_back

using namespace std;

i64 N;
vector <int> f, p;
int fk[vk], x;
char rng[dmax];

void ciurulika(){
    p.pb(2);
    for (int it = 3 ; it < dmax; it += 2)
        rng[it] = 1;
    for (int it = 3 ; it < dmax; it += 2){
            if (!rng[it])
               continue;
            p.pb(it);
            for (int j = (it << 1) + it; j < dmax; j += it << 1)
                rng[j] = 0;
    }
}

void doit (){
    for (int it = 0 ; it < szs(p) && p[it] * p[it] <= x; ++ it){
            if (x % p[it])
              continue;
            f.pb(p[it]);
            while (x % p[it] == 0)
                x /= p[it];
    }
    if (x > 1)
        f.pb(x);
}


int main(){
    freopen ("pairs.in", "r", stdin);
    freopen ("pairs.out", "w", stdout);
    scanf ("%lld", &N);
    i64 Res = (1LL * N * (N - 1)) >> 1LL;
    ciurulika();
    for (int i = 0 ; i < N ; ++ i ){
        scanf ("%d", &x);
        f = vector <int>();
        doit();
         for (int mask = 1; mask < (1 << szs(f)); ++ mask){
            int prod = 1, nr = 1;
            for (int it = 0 ; it < szs(f); ++ it){
                    if ((1 << it) & mask)
                       prod *= f[it], nr ++;
            }
            nr = (nr & 1 ? 1 : -1);
            Res += fk[prod] * nr;
            ++ fk[prod];
    }
}
    printf ("%lld", Res);
    return 0;
}