Cod sursa(job #252023)

Utilizator ProtomanAndrei Purice Protoman Data 3 februarie 2009 20:05:49
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <algorithm>
#include <stdio.h>

#define MAX 1000010

using namespace std;

int n, valMax;
short vctAp[MAX], vctDivPrimi[MAX];
int vctNrForm[MAX];

int main()
{
	freopen("pairs.in", "r", stdin);
	freopen("pairs.out", "w", stdout);
	
	scanf("%d", &n);

	for (int i = 1; i <= n; i++)
	{
		int elem;
		scanf("%d", &elem);
		vctAp[elem] = 1;

		valMax = max(valMax, elem);
	}

	for (int i = 1; i <= valMax; vctNrForm[i] = 1, i++);

	for (int i = 2; i <= valMax; i++)
		if (!vctDivPrimi[i])
			for (int j = i; j <= valMax; j += i)
			{
				vctDivPrimi[j]++;
				vctNrForm[j] *= i;
			}

	long long sol = (long long) n * (n - 1) / 2;

	for (int i = 2; i <= valMax; i++)
		if (vctNrForm[i] == i)
		{
			long long nrMult = 0;

			for (int j = i; j <= valMax; j += i)
				nrMult += vctAp[j];

			if (vctDivPrimi[i] & 1)
				sol -= (nrMult - 1) * nrMult / 2;
			else sol += (nrMult - 1) * nrMult / 2;
		}

	printf("%lld", sol);

	fclose(stdin);
	fclose(stdout);
	return 0;
}