Cod sursa(job #549346)

Utilizator Eugen01Vasilescu Eugen Eugen01 Data 8 martie 2011 14:48:12
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include<stdio.h>
#include <math.h>
#define Nmax 1000001
#define L long long

int max,nr,i,j,n,m,a[Nmax],prim[1000];
bool ok[10000],put[200];
L rez;

void ciur()
{
	int i,j;
	
	prim[nr=1]=2;
	
	for (i=3;i<=(int)sqrt(Nmax);i+=2)
		if (!ok[i])
		{
			prim[++nr]=i;
			for (j=i*i;j<=sqrt(Nmax);j+=(2*i))
				ok[j]=true;
		}
}

void back(int k,int p)
{
	int i;
	
	if (p!=1) 
	{
		L q=0;
		for (i=1;i<=n;i++)
			if (a[i]%p==0) q++;
		q=(L)q*(q-1)/2;
		if (k%2==1) rez-=q;
			else rez+=q;
	}
		
	for (i=1;i<=nr;i++)
		if (!put[i])
		{
			put[i]=true;
			if ((L)p*prim[i]<max) back(k,p*prim[i]);
			put[i]=false;
		}
}

int main()
{
	freopen("pairs.in","r",stdin);
	freopen("pairs.out","w",stdout);
	
	scanf("%d",&n);
	
	for (i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		if (a[i]>max) max=a[i];
	}
	
	rez=(L)n*(n-1)/2;
	
	ciur();
	
	back(1,1);
	
	printf("%d\n",rez);
	return 0;
}