Cod sursa(job #549446)

Utilizator Eugen01Vasilescu Eugen Eugen01 Data 8 martie 2011 16:36:24
Problema Pairs Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include<stdio.h>
#include<math.h>
#define Nmax 1000009
#define L long long

int sol[1000],max,nr,i,j,n,m,prim[1000],c[Nmax];
bool ok[Nmax],a[Nmax];
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&&p<=max)
		if (k%2==0) rez=rez-(1LL*c[p]*(c[p]-1)/2);
			else rez=rez+(1LL*c[p]*(c[p]-1)/2);
	
	for (i=sol[k-1]+1;i<=nr;i++)
	{
			sol[k]=i;
			if (1LL*p*prim[i]<=max) back(k+1,p*prim[i]);
	}
}


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

	ciur();

	for (j=1;j<=max;j++)
		for (i=j;i<=max;i+=j)
			if (a[i]) c[j]++;

	back(1,1);	

	printf("%lld\n",rez);

	return 0;
}