Cod sursa(job #357305)

Utilizator FlorianFlorian Marcu Florian Data 18 octombrie 2009 19:51:27
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
using namespace std;
#include<cstdio>
#define MAX_N 1<<20
int N;
int nr[MAX_N]; // nr[i] = nr de nr care se impart la i
int nrd[MAX_N]; // nrd[i] = nr de divizori primi a lui i
bool viz[MAX_N];
long long Max;
void eratostene()
{
	long long i,j;
	for(i=2; i <= Max; ++i)
	{
		if(nrd[i] == 0)
			{
				for(j=i*i; j<=Max; j+=i*i) nrd[j] = -1;
				for(j=i; j<= Max; j+=i) if(nrd[j] >= 0) ++nrd[j];
			}
	}
}
int main()
{
	freopen("pairs.in","r",stdin);
	freopen("pairs.out","w",stdout);
	scanf("%d",&N);
	long long sol = 0;
	long long i,j, a;
	for(i=1;i<=N;++i) 
	{
		scanf("%lld",&a);
		viz[a]=true;
		if(a > Max) Max = a;
	}
	eratostene();
	for(i = 2; i <= Max; ++i)
	{
		for(j=i;j<=Max;j+=i)
			if(viz[j]) ++nr[i];
	}
	for(i=2;i<=Max;++i)
		if(nrd[i] > 0)
			if(nrd[i]&1) sol += (long long)nr[i]*(nr[i]-1)/2;
			else sol -= (long long)nr[i]*(nr[i]-1)/2;
	printf("%lld\n",(long long)N*(N-1)/2 - sol);
	return 0;
}