Cod sursa(job #273535)

Utilizator tvladTataranu Vlad tvlad Data 8 martie 2009 18:40:10
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 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) {
					if (j % (i*i)) {
						++p[j];
					} else {
						p[j] = -1;
					}
				}
			}
		}
	}

	long long bad = 0;
	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;
}