Cod sursa(job #214779)

Utilizator horiama1Mania Horia horiama1 Data 15 octombrie 2008 21:25:15
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include<stdio.h>
struct dub{
	int i,j;
};
dub p[1000000];
long long n,i,x,j,c,k,max=-1;
int v[1000000],ver[1000000];
int main()
{
	freopen("pairs.in","r",stdin);
	freopen("pairs.out","w",stdout);
	scanf("%lld",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&x);
		if(max<x)
			max=x;
		v[x]=1;
	}
	if(n%2==0)
		c=n/2*(n-1);
	else
		c=(n-1)/2*n;
	p[2].j=1;
	for(i=2;i<=max;i++)
		if(p[i].i==0)
		{
			p[i].j=1;
			for(j=2*i;j<=max;j+=i)
				p[j].i=1;
		}
	for(i=2;i<=max;i++)
		if(p[i].i==0)
			for(j=2*i;j<=max;j+=i)
			{
				if(p[j/i].j==-1)
					p[j].j=-1;
				else
				p[j].j=p[j/i].j+1;
				if(j==i*i)
					p[j].j=-1;
			}
    for(i=2;i<=max;i++)
	{
		if(p[i].j!=-1)
		{
			for(j=i;j<=max;j+=i)
				if(v[j]==1)
					ver[i]++;
			if(p[i].j%2==0)
				c=c+ver[i]*(ver[i]-1)/2;
			else
				c=c-ver[i]*(ver[i]-1)/2;
		}

	}
	printf("%lld",c);
return 0;
}