Cod sursa(job #485963)

Utilizator Addy.Adrian Draghici Addy. Data 20 septembrie 2010 07:52:01
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <cstdio>

#define MAX 1000000
#define PMAX 1000000
#define QMAX 1000000

int P[PMAX], PM[MAX], Q[QMAX], QF[QMAX], viz[MAX], NQ, x, y, i, j, u, max, vmax;
long long A[MAX], n, t, sol;

int main () {
	
	freopen ("pairs.in", "r", stdin);
	freopen ("pairs.out", "w", stdout);
	
	for (i = 2; i * i <= MAX; i++)
		if (!P[i]) {
			P[++P[0]] = i;
			for (j = 2 * i; j * j <= MAX; j += i)
				P[j] = 1;
		}
	
	scanf ("%lld", &n);
	for (i = 1; i <= n; i++) {
		scanf ("%d", &x);
		
		viz[x] = 1;
		
		if (x > vmax) vmax = x;
		
		y = x;
		for (j = 1; P[j] * P[j] <= x && j <= P[0] && y != 1; j++)
			if (y % P[j] == 0) {
				if (P[j] > max) max = P[i];
				while (y % P[j] == 0)
					y /= P[j];
			}
		if (y != 1) {
			if (y > max) max = y;
			if ((long long) y * (long long) y > MAX)
				PM[++PM[0]] = y;
		}
	}
	
	for (i = 2; i <= MAX; i++)
		for (j = 1; j <= MAX / i; j++)
			if (viz[i * j])
				A[i]++;
	
	sol = n * (n - 1) / 2LL;
	
	Q[0] = 1, NQ = 0;
	for (i = 1; i <= P[0] && P[i] <= max; i++) {
		u = NQ;
		for (j = 0; j <= u; j++) {
			x = P[i] * Q[j];
			if (x <= vmax) {
				NQ++, Q[NQ] = x, QF[NQ] = QF[j] + 1;
				t = A[Q[NQ]] * (A[Q[NQ]] - 1) / 2LL;
				if (QF[NQ] % 2)
					sol -= t;
				else
					sol += t;
			}
		}
	}
	
	for (i = 1; i <= PM[0]; i++) {
		u = NQ;
		for (j = 0; j <= u; j++) {
			x = PM[i] * Q[j];
			if (x <= vmax) {
				NQ++, Q[NQ] = x, QF[NQ] = QF[j] + 1;
				t = A[Q[NQ]] * (A[Q[NQ]] - 1) / 2LL;
				if (QF[NQ] % 2)
					sol -= t;
				else
					sol += t;
			}
		}
	}
	
	printf ("%lld", sol);
	
	return 0;
}