Cod sursa(job #213791)

Utilizator RegeleUmbrelorPopescu Mihai RegeleUmbrelor Data 11 octombrie 2008 16:39:17
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
using namespace std;
#include<fstream>
#include<vector>
const int M=1000005;
int N,x[M],nrd[M];

vector<bool> v(M,false);    

void div()
{
	int i,k,j;
	for(i=2;i<M;++i)
	{
		if(nrd[i]==-1)
			continue;
		if(nrd[i]==0)//i este prim;
		{
			for(j=i;j<M;j+=i)
				if(nrd[j]!=-1)
					++nrd[j];
			if(i>1000)
				continue;
			k=i*i;
			for(j=k;j<M;j+=k)
				nrd[j]=-1;
		}
		for(j=i;j<M;j+=i)
			if(v[j])
				++x[i];
	}
}
inline long long comb(int n)
{
	long long nn=(long long)n;
	return nn*(nn-1)/2;
}
long long calcul()
{
	int i;
	long long s=comb(N);
	for(i=1;i<M;++i)
		if(nrd[i]!=-1)
			if(nrd[i]%2)
				s-=comb(x[i]);
			else
				s+=comb(x[i]);
	return s;
}
	
int main()
{
	int i,a;
	ifstream in("pairs.in");
	ofstream out("pairs.out");
	in>>N;
	for(i=1;i<=N;i++)
	{
		in>>a;v[a]=true;
	}
	div();
	out<<calcul();
	in.close();	out.close();
	return 0;
}