Cod sursa(job #419286)

Utilizator vladiiIonescu Vlad vladii Data 17 martie 2010 11:37:21
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <iostream>
using namespace std;
#define LL long long
int N, M, NR[1000010], X[1000010];
bool A[1000010];
long long sol;

int main() {
    FILE *f1=fopen("pairs.in", "r"), *f2=fopen("pairs.out", "w");
    int i, as;
    long long p, q;
    fscanf(f1, "%d", &N);
    for(i=1; i<=N; i++) {
         fscanf(f1, "%d", &as);
         A[as]=1; M=max(M, as);
    }
    for(i=2; i<=M; i++) {
         for(int j=i; j<=M; j+=i) {
              if(A[j]) { X[i]++; }
         }
    }
    for(i=2; i<=M; i++) {
         if(!NR[i]) {
              for(LL j=(LL)(i*i); j<=M; j+=(LL)(i*i)) { NR[j]=-1; }
              for(int j=i; j<=M; j+=i) {
                   if(NR[j]>-1) { NR[j]++; }
              }
         }
    }
    for(i=2; i<=M; i++) {
         if(NR[i]) {
              p=(LL)((LL)X[i]*(X[i]-1))/(LL)2;
              if(NR[i]%2) { 
                   sol+=(LL)p; 
              }
              else { sol-=(LL)p; }
         }
    }
    p=(LL)((LL)N*(N-1))/(LL)2; p=(LL)p-(LL)sol;
    fprintf(f2, "%lld\n", (LL)p);
    fclose(f1); fclose(f2);
    return 0;
}