Cod sursa(job #630491)

Utilizator ChallengeMurtaza Alexandru Challenge Data 5 noiembrie 2011 17:23:46
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <fstream>

using namespace std;

const char InFile[]="pairs.in";
const char OutFile[]="pairs.out";
const int MaxM=1000111;
const int MaxN=100111;

ifstream fin(InFile);
ofstream fout(OutFile);

int M,x,V[MaxM],P[MaxM],D[MaxM];
long long N,sol;

int main()
{
	fin>>N;
	for(register int i=1;i<=N;++i)
	{
		fin>>x;
		if(M<x)
		{
			M=x;
		}
		V[x]=1;
	}
	fin.close();

	for(register int i=2;i<=M;++i)
	{
		P[i]=1;
	}
	for(register int i=2;i<=M;++i)
	{
		if(P[i]==1)
		{
			for(register int j=i;j<=M;j+=i)
			{
				P[j]*=i;
				++D[j];
			}
		}
	}
	sol=((N*(N-1))>>1LL);
	for(register int i=2;i<=M;++i)
	{
		if(P[i]==i)
		{
			long long cnt=0;
			for(register int j=i;j<=M;j+=i)
			{
				cnt+=V[j];
			}
			long long val=((cnt*(cnt-1))>>1LL);
			if(D[i]&1)
			{
				sol-=val;
			}
			else
			{
				sol+=val;
			}
		}
	}

	fout<<sol;
	fout.close();
	return 0;
}