Cod sursa(job #109673)

Utilizator sims_glAlexandru Simion sims_gl Data 25 noiembrie 2007 12:21:00
Problema Pairs Scor 100
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasa a 10-a Marime 1.09 kb
#include <stdio.h>
#include <vector>

using namespace std;

#define nm 100100
#define mm 1048576

int n, crt = 1, a[nm], v[mm], c[mm], len[nm];
vector<int> d[nm];
long long sol;

void go(int x, int pos, int nr)
{
	if (pos == len[x]) {
		if (crt > 1) {
			if (nr % 2 == 0)
				sol = (long long)sol + c[crt];
			else
				sol = (long long)sol - c[crt];

			++c[crt];
		}
	} else {
		go(x, pos + 1, nr);
		crt *= d[x][pos];
		go(x, pos + 1, nr + 1);
		crt /= d[x][pos];
	}
}

int main()
{
	freopen("pairs.in", "r", stdin);
	freopen("pairs.out", "w", stdout);

	scanf("%d", &n);

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

	for (int i = 2; i <= 1024; ++i) {
		int ok = 1;

		for (int j = 1; j <= v[0] && ok; ++j)
			if (i % v[j] == 0)
				ok = 0;

		if (ok)
			v[++v[0]] = i;
	}

	for (int i = 1; i <= n; ++i) {
		for (int j = 1; v[j] * v[j] <= a[i]; ++j)
			if (a[i] % v[j] == 0) {
				d[i].push_back(v[j]);
				for (; a[i] % v[j] == 0; a[i] /= v[j]);
			}

		if (a[i] > 1)
			d[i].push_back(a[i]);

		len[i] = d[i].size();

		sol = (long long)sol + i - 1;

		go(i, 0, 0);
	}

	printf("%lld\n", sol);

	return 0;
}