Cod sursa(job #397238)

Utilizator GotenAmza Catalin Goten Data 16 februarie 2010 18:15:30
Problema Pairs Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include<math.h>
#include<fstream.h>
int x[1000100],k[1000100],w[200100],v[1000100];
int main()
{
	int max=0,n,i,j,nn,a,b,d,c,gasit,ok,nr;
	long long r=0;
	ifstream f("pairs.in");
	ofstream g("pairs.out");
	f>>n;
	for(i=1;i<=n;i++)
	{
		f>>a;
		if(a>max)
			max=a;
		k[a]=1;
	}
	for(i=2;i<=max;i++)
		for(j=1;j<=max/i;j++)
			if(k[i*j])
				x[i]++;
	nn=sqrt(max);
	w[++w[0]]=2;
	d=3;
	while(d<=max)
	{
		w[++w[0]]=d;
		if(d<=nn)
		{
			a=d*d;
			b=(d<<1);
			while(a<=max)
			{
				c=(a>>1);
				if(!v[c])
					v[c]=1;
				a+=b;
			}
		}
		gasit=0;
		c=(d>>1)+1;
		while(!gasit)
		{
			if(!v[c])
			{
				d=(c<<1)+1;
				gasit=1;
			}
			else c++;
		}
	}
	for(i=2;i<=max;i++)
	{
		nr=0;
		ok=1;
		a=i;
		for(j=1;w[j]*w[j]<=a&&ok;j++)
		{
			if(a%w[j]==0)
			{
				nr++;
				a/=w[j];
			}
			if(a%w[j]==0)
				ok=0;
		}
		if(ok)
		{
			if(a>1)
				nr++;
			if(nr%2)
				r+=1ll*x[i]*(x[i]-1)/2;
			else
				r-=1ll*x[i]*(x[i]-1)/2;
		}
	}
	g<<1ll*n*(n-1)/2-r;
	return 0;
}