Cod sursa(job #102395)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 14 noiembrie 2007 12:57:23
Problema Pairs Scor Ascuns
Compilator cpp Status done
Runda Marime 0.82 kb
#include <stdio.h>
#include <assert.h>
#include <algorithm>

using namespace std;

#define nmax 100111
#define lmax 1000111
#define FOR(i,s,d) for(i=(s);i<(d);++i)

typedef long long lint;

int n,A[lmax],B[lmax];
lint sol;
char viz[lmax],nt[lmax];

int main()
{
	int i,j,x;
	assert(freopen("pairs.in","r",stdin));
	freopen("pairs.out","w",stdout);
	assert(scanf("%d",&n)==1);
	assert(n<=100000);
	assert(n>=2);
	FOR(i,0,n)
	{
		assert(scanf("%d",&x)==1);
		assert(x<=1000000);
		assert(x>=1);		
		viz[x]=1;
	}
	FOR(i,2,lmax)
	{
		for(j=i;j<lmax;j+=i)
			if(viz[j])
				B[i]++;
		if(A[i])
			continue;
		for(j=i;j<lmax;j+=i)
			if((j/i)%i==0)
				nt[j]=1;
			else
				A[j]++;
	}
	FOR(i,2,lmax)
		if(!nt[i])
			if(A[i]&1)
				sol+=(lint)B[i]*(B[i]-1)/2;
			else
				sol-=(lint)B[i]*(B[i]-1)/2;
	printf("%lld\n",(lint)n*(n-1)/2-sol);
	return 0;
}