Cod sursa(job #213307)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 9 octombrie 2008 13:26:05
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <stdio.h>
#include <math.h>

long n, i, j, max, k, div[1000100], ap[1000100], nr[1000100];
long long rez;

int main() {
	freopen("pairs.in", "r", stdin);
	freopen("pairs.out", "w", stdout);
	scanf("%ld", &n);
	max = 0;
	for (i = 0; i < n; ++i){
		scanf("%ld", &j);
		nr[j] = 1;
		if (j > max) {
			max = j;
		}
	}
	for (i = 2; i <= max; ++i){
		if (div[i] > 1) {
			for (j = i; j <= max; j += i){
				if (nr[j]) {
					++ap[i];
				}
			}
		}
		if (div[i] == 0) {
			for (j = i; j <= max; j += i) {
				++div[j];
				if (nr[j]) {
					++ap[i];
				}
			}
			if (i < 1500) {
				k = i * i;
				for (j = k;j <= max; j += k) {
					div[j] = -1000;
				}
			}
		}
	}
	rez = 0;
	for (i = 2; i <= max; ++i){
		if(ap[i]) {
			if (div[i] % 2 == 0) {
				rez -= (((long long)ap[i]) * (ap[i] - 1)) / 2;
			} else {
				rez += (((long long)ap[i]) * (ap[i] - 1)) / 2;
			}
		}
	}
	rez = (((long long)n) * (n - 1)) / 2 - rez;
	printf("%lld\n", rez);
	return 0;
}