Cod sursa(job #161402)

Utilizator C_OvidiuCotletz Ovidiu C_Ovidiu Data 17 martie 2008 23:03:02
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<stdio.h>
#include<fstream.h>
#include<math.h>
#define nmax 100002
#define nrm 1000002

long n,B[nmax],A[nmax],kk,div[100],p[nmax],d[nrm];
char viz[nrm],viz1[nrm],prim[nrm];
void merge_sort(long ls,long ld)
{
int m=(ls+ld)>>1,i,j,k;
if(ls==ld)
 return;
merge_sort(ls,m);
merge_sort(m+1,ld);
for(k=ls,i=ls,j=m+1;k<=ld;)
 if(j>ld||i<=m&&A[i]<A[j])
   B[k++]=A[i++];
 else
   B[k++]=A[j++];

for(k=ls;k<=ld;k++)
 A[k]=B[k];
}



int main()
{long x,i,j,k,pr,nr,sol=0,rad;

freopen("pairs.in","r",stdin);
scanf("%ld",&n);
for(i=1;i<=n;i++)
 {scanf("%ld",&A[i]);
  viz[A[i]]=1;
  }


merge_sort(1,n);
for(i=2;i<=A[n];i++)
  {
  if(!viz1[i])
	{p[++p[0]]=i;
	 prim[i]=1;
	 }

  for(j=i;j<=A[n];j+=i)
   {
	if(viz[j])
		d[i]+=1;
	viz1[j]=1;
   }

  }

for(i=1;i<=n;i++)
  {x=A[i];
   memset(div,0,sizeof(div));
   for(j=1,rad=sqrt(x);j<=rad;j++)
	 if(!(x%j))
	   {
	   if(prim[j])
		 div[++div[0]]=j;
	   if(prim[x/j]&&x/j!=div[div[0]])
		 div[++div[0]]=x/j;
	   }



   if(!div[0])
	 div[++div[0]]=x;
   //for(j=1;j<=div[0];j++)
   //	 d[div[j]]--;
   for(k=1,nr=0;k< (1<<div[0]);k++)
	 {
	 for(j=0,kk=0,pr=1;j<div[0];j++)
	   if(k&1<<j)
		 {pr*=div[j+1];kk++;}
	 d[pr]--;
	 if(kk%2)
	   nr+=d[pr];
	 else
	   nr-=d[pr];
	 }
  sol+=(n-i-nr);

  }

freopen("pairs.out","w",stdout);
printf("%ld",sol);
fclose(stdout);
return 0;
}