Cod sursa(job #593234)

Utilizator SpiderManSimoiu Robert SpiderMan Data 1 iunie 2011 20:29:18
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.83 kb
# include <cstdio>

const char *FIN = "pairs.in", *FOU = "pairs.out" ;
const int MAX = 1000001 ;

int cnt[MAX], N ;
bool prim[MAX], stop[MAX], X[MAX] ;

int main (void) {
    freopen (FIN, "r", stdin) ;

    scanf ("%d", &N) ;
    for (int i = 1, x; i <= N; ++i) {
        scanf ("%d", &x) ;
        ++cnt[x] ;
    }

    long long sol = 1LL * N * (N - 1) / 2 ;
    for (int i = 2; i < MAX; ++i) {
        for (int j = i << 1; j < MAX; j += i)
            cnt[i] += cnt[j] ;
        if (prim[i]) continue ;
        X[i] = 1 ;
        for (int j = i << 1; j < MAX; j += i) {
            prim[j] = 1, X[j] ^= 1 ;
            if ( (j / i) % i == 0 ) stop[j] = 1 ;
        }
        if (stop[i]) continue ;
        sol += (X[i] ? -1LL : 1LL) * cnt[i] * (cnt[i] - 1) / 2 ;
    }
    fprintf (fopen (FOU, "w"), "%lld", sol) ;
}