Cod sursa(job #265106)

Utilizator savimSerban Andrei Stan savim Data 23 februarie 2009 12:11:34
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <stdio.h>
#include <math.h>

#define MAX_D 1000010

int n, k, rad, d, m;
int fact[110];
int fol[MAX_D];
long long sol;

void calc_div(int val) {
    rad = (int) sqrt(val); d = 1; m = 0;
    
    while (val != 1 && d <= rad) {
          d++;
          if (val % d == 0) fact[++m] = d;
          while (val % d == 0) val /= d;
    }
    if (val != 1) fact[++m] = val;
}

int back(int val) {
     int rez = 0;
    
     for (int i = 1; i < (1 << m); i++) {
         int n0 = 0; d = 1;  
         for (int j = 0; j < m; j++)
             if (i & (1 << j)) {
                n0++;
                d *= fact[j + 1];
             }
         if (n0 % 2) rez += fol[d];
         else rez -= fol[d];
         
         fol[d]++;
     }
     
     return rez;
}

int main() {

    freopen("pairs.in", "r", stdin);
    freopen("pairs.out", "w", stdout);
    
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &k);
        
        calc_div(k);
        
        sol += i - back(k);
    }
    
    printf("%lld\n", sol);

    return 0;
}