Cod sursa(job #124490)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 19 ianuarie 2008 14:15:45
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <stdio.h>
#include <stdlib.h>

long n,i,j,k,q,a[1000002],x,nr;
long v[1000002],prim[200],xmax,ok,list[25];
long long p;

int comp(const void * n1,const void * n2){
    return *((long*)n1)-*((long*)n2);
}

int main(){
    freopen("pairs.in","r",stdin);
    freopen("pairs.out","w",stdout);
    
    scanf ("%ld",&n);
    p=(long long)n*(n-1)/2;
    for (i=1;i<=n;i++){
        scanf ("%ld",&x);
        if (x>xmax)xmax=x;
        a[x]++;
    }
    for (i=1;i<=xmax;i++)
        for (j=1;j<=xmax/i;j++)
            v[i]+=a[i*j];
    //nr prime
    i=5;
    q=2;
    prim[1]=2;
    prim[2]=3;
    while (i<1200){
          ok=1;
          j=1;
          while (prim[j]*prim[j]<=i){
                if (i%prim[j]==0){ok=0;break;}
                j++;
          }
          if (ok){q++;prim[q]=i;}
          i+=2;
    }/*
    for (i=2;i<=xmax;i++){
        k=0;nr=i;
        while (nr!=1){
              ok=0;
              for (j=1;prim[j]*prim[j]<=nr;j++)
                  if (nr%prim[j]==0){nr/=prim[j];ok=1;k++;list[k]=prim[j];}
              if (!ok&&nr>1){k++;list[k]=nr;nr=1;}
        }
        //qsort(list,k+1,sizeof(long),comp);
        ok=1;
        //for (j=1;j<k;j++)if (list[j]==list[j+1]){ok=0;break;}
        if (ok)
           if (k%2==1)p-=(long long)v[i]*(v[i]-1)/2;
           else p+=(long long)v[i]*(v[i]-1)/2;
    }
    */
    printf("%ld\n",p);
    
    return 0;
}