Cod sursa(job #213536)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 10 octombrie 2008 11:10:49
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <stdio.h>
#include <vector>
using namespace std;
const long N=2000010;

vector <bool> m(N,false);
char nr[N];
long long maxim, n, sol;

void read()
{
	long long t, i;
	freopen("pairs.in","r",stdin);
	freopen("pairs.out","w",stdout);
	scanf(" %lld", &n);
	for (i=1; i<=n; i++)
	{
		scanf("%lld", &t);
		if (maxim<t)
			maxim=t;
		m[t] = true;
	}//for i
}//read

inline long long combinari(long long x)
{
	return (long long)(x*(x-1)/2);
}//combinari

void solve()
{
    long long i, j, k, v;
    sol=combinari(n);
	for (i=2; i<=maxim; i++)
	{
		v=0;
		if (nr[i]==-1)
			continue;
		if (nr[i]==0)
			for (j=i; j<=maxim; j+=i)
			{
				if (nr[j]!=-1)
				  nr[j]++;
			}//for j
		k = (long long) (i*i);
		for (j=i; j<=maxim; j+=i)
		{
			if (m[j])
				v++;
		}//for j
		if ((2*k)<=1000000)
		  for (j=k; j<=maxim; j+=k)
			nr[j]=-1;
		else
		  if (k<=1000000)
			nr[k]=-1;
		if (nr[i]%2 == 0)
			sol+=combinari(v);
		else
			sol-=combinari(v);		
	}//for i
}//solve

void print()
{
	printf("%lld\n", sol);
}//print
	
int main()
{
	
	read();
	solve();
	print();
	return 0;
}//main