Cod sursa(job #109386)

Utilizator scapryConstantin Berzan scapry Data 25 noiembrie 2007 10:38:34
Problema Pairs Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 11-12 Marime 0.95 kb
#include <cassert>
#include <cstdio>
using namespace std;

enum { maxn = 100002, maxv = 1000002 };

int n;
int num[maxn];
bool exists[maxv];
int divs[maxv]; //divizori distincti != 1

long long ans;

inline long long c2(int val)
{
	assert(val >= 0);
	long long ret = val;
	ret *= (val - 1);
	ret /= 2;

	return ret;
}

void go()
{
	int now, val, count;

	ans = c2(n);

	for(now = 2; now < maxv; now++)
	{
		if(exists[now])
			count = 1;
		else
			count = 0;

		for(val = now + now; val < maxv; val += now)
		{
			if(divs[now] == 0) //prime
				divs[val]++;
			if(exists[val])
				count++;
		}

		if(divs[now] != 1) //considered before
		{
			if(divs[now] == 0 || divs[now] % 2)
				ans -= c2(count);
			else
				ans += c2(count);
		}
	}
}

int main()
{
	freopen("pairs.in", "r", stdin);
	scanf("%d", &n);
	for(int i = 0; i < n; i++)
	{
		scanf("%d", &num[i]);
		exists[ num[i] ] = true;
	}

	go();

	freopen("pairs.out", "w", stdout);
	printf("%lld\n", ans);
	return 0;
}