Cod sursa(job #359080)

Utilizator Mishu91Andrei Misarca Mishu91 Data 25 octombrie 2009 18:02:54
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <fstream>

using namespace std;

#define MAX_N 100005
#define MAX_M 1000005
#define MAX_D 1005

ifstream fin ("pairs.in");
ofstream fout ("pairs.out");

int N, V[MAX_N], D[MAX_D], Nr[MAX_M];
long long Sol;

void citire()
{
	fin >> N;

	for(int i = 1; i <= N; ++i)
		fin >> V[i];
}

void solve()
{
	for(int i = 1; i <= N; ++i)
	{
		if((V[i] & 1) == 0)
		{
			D[ D[0] = 1 ] = 2;
			for(;(V[i] & 1) == 0; V[i] >>= 1);
		}
		else
			D[0] = 0;

		int x = V[i];
		for(int k = 3; k*k <= V[i]; k+=2)
			if((x % k) == 0)
				for(D[ ++D[0] ] = k; (x % k) == 0; x /= k);

		if(x > 1) D[ ++D[0] ] = x;

		int T = (1 << D[0]), nr = 0;
		for(int k = 1; k < T; ++k)
		{
			int nrb = 0, p = 1;
			for(int j = 0; j < D[0]; ++j)
				if(k & (1 << j))
					++nrb,
					p*=D[j+1];

			if(nrb & 1) nr += Nr[p];
			else nr -= Nr[p];

			++Nr[p];
		}

		Sol += (i-1-nr);
	}

	fout << Sol << "\n";
}

int main()
{
	citire();
	solve();
}