Mai intai trebuie sa te autentifici.

Cod sursa(job #158599)

Utilizator MariusGeantaMarius Geanta MariusGeanta Data 13 martie 2008 18:31:42
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
	v[0]=v[1]=1;p[1]=2;m=1;
	for (i=4;i<=max;i+=2) v[i]=1;
	for (i=3;i<=max;i+=2)
		if (!v[i])
		{ p[++m]=i;
		  for (j=3;j*i<=max;j+=2)
			v[i*j]=1;
		}
	//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;
}