Cod sursa(job #273676)

Utilizator tvladTataranu Vlad tvlad Data 8 martie 2009 21:06:43
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <cstdio>

const int NMAX = 100000;
const int VMAX = 1000001;

int n,m;
int v[NMAX], c[VMAX], p[NMAX];
bool ex[VMAX];

int main() {
	freopen("pairs.in","rt",stdin);
	freopen("pairs.out","wt",stdout);
	scanf("%d",&n);
	m = 0;
	for (int i = 0; i < n; ++i) {
		scanf("%d",&v[i]);
		ex[v[i]] = true;
		if (m < v[i])
			m = v[i];
	}
	
	for (int i = 2; i <= m; ++i) {
		for (int j = i; j <= m; j += i) {
			c[i] += ex[j];
		}
	}

	for (int i = 2; i <= m; ++i) {
		if (p[i] == 0) {
			for (int j = i+i; j <= m; j += i) {
				if (p[j] != -1 && j % (i*i) != 0)
						++p[j]; else
						p[j] = -1;
			}
		}
	}

	int nrb = 0, P;
	long long bad = 0;

	for (int i = 2; i <= m; ++i) {
		if (p[i] >= 0) {
			nrb = p[i];
			if (nrb == 0) nrb = 1;
			if (nrb % 2 == 1)
				bad += (long long) ((long long) c[i] * (long long) (c[i] - 1) / 2); else
				bad -= (long long) ((long long) c[i] * (long long) (c[i] - 1) / 2);
		}
	}
/*	for (int i = 2; i <= m; ++i) {
		if (p[i] >= 0) {
			p[i] = 1;
			if (p[i] % 2)
				bad += (long long)c[i] * (c[i]-1) / 2; else
				bad -= (long long)c[i] * (c[i]-1) / 2;
		}
	}*/
	long long rez = (long long)n*(n-1)/2 - bad;

	printf("%lld\n",rez);
	return 0;
}