Cod sursa(job #158616)

Utilizator MariusGeantaMarius Geanta MariusGeanta Data 13 martie 2008 18:44:20
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include<stdio.h>
long x[1000002],p[200],a[1000002],v[1000002],n,max;
long long rez;

int main()
{       long aux,i,j,ok,mult,m,k;
	//citire date
	FILE *f=fopen("pairs.in","r");
	fscanf(f,"%ld",&n);
	max=0;
	for (i=1;i<=n;i++)
	{	fscanf(f,"%ld",&aux);
		if (aux>max) max=aux;
		a[aux]=1;
	}
	fclose(f);
	//construiesc vector x
	for (i=2;i<=max;i++)
		for (j=1;i*j<=max;j++)
			if (a[i*j]) x[i]++;
	//ciur
	p[1]=2;p[2]=3;m=2;
	for (i=5;i<=1200;i+=2)
	{	ok=1;j=1;
		while (p[j]*p[j]<=i&&ok)
			if (i%p[j]==0) ok=1;
			else j++;
		if (ok)	p[++m]=i;
	}
	//determin rez
	for (i=2,rez=0;i<=max;i++)
		{ aux=i;
		  j=1;ok=1;
		  k=0;
		  if (!v[i]) aux=k=1;
		  else
		  while (j<=m&&p[j]<=aux&&ok)
		  {     mult=0;
			while (aux%p[j]==0)
			{  mult++;
			   aux/=p[j]; }
			if (mult>1) ok=0;
			else { j++;
			       if (mult>0) k++; }
		  }
		  if (ok&&aux<=1)
			if (k%2) rez+=(long long)x[i]*(x[i]-1)/2;
			else rez-=(long long)x[i]*(x[i]-1)/2;
		}
	//afisare
	FILE *g=fopen("pairs.out","w");
	fprintf(g,"%lld",(long long)n*(n-1)/2-rez);
	fclose(g);
	return 0;
}