Cod sursa(job #213723)

Utilizator AthanaricCirith Gorgor Athanaric Data 11 octombrie 2008 11:37:51
Problema Pairs Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <stdio.h>
#define N 1000005
#include <vector>
using namespace std;
int nrd[N],v[N];
vector <bool> set(N,false);
void ciur()
{
	int i,j,k;
	for (i=2; i<N; i++)
	{
		if (nrd[i]==-1)
			continue;
		if(nrd[i]==0)
		{
			//daca i este prim, actualizam nrd
			for (j=i; j<N; j+=i)
				if(nrd[j]!=-1)
					nrd[j]++;
			if(i<=1000)
			{
				k=i*i;
				for (j=k; j<N; j+=k)
					nrd[j]=-1;
			}
		}
		//actualizam v[i]
		for(j=i; j<N; j+=i)
			if(nrd[j] && set[j])
				v[i]++;
	}
}

inline long long comb(int n)
{
	long long nn=(long long)n;
	return nn*(nn-1)>>1;
}

int solvez0r()
{
	ciur();
	long long ss=0;
	for (int i=1; i<N; i++)
	{
		if (nrd[i]!=-1)
		{
			if (nrd[i]%2)
				ss+=comb(v[i]);
			else
				ss-=comb(v[i]);
		}
	}
	return ss;
}
int main()
{
	freopen("pairs.in","r",stdin);
	freopen("pairs.out","w",stdout);
	long long s;
	int n,x,i;
	scanf("%d",&n);
	for (i=1; i<=n; i++)
	{
		scanf("%d",&x);
		set[x]=true;
	}
	s=comb(n);
	printf("%lld\n",s-solvez0r());
	return 0;
}