Cod sursa(job #132990)

Utilizator alex_dincaDinca Alexandru-Nicolae - UPB alex_dinca Data 7 februarie 2008 10:37:31
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 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]=1;
    }
    for (i=1;i<=xmax;i++)
        for (j=1;j<=xmax/i;j++)
            v[i]+=a[i*j];
    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++){
        if (v[i]<=1)continue;
        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("%lld\n",p);
    return 0;
}