Cod sursa(job #121495)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 8 ianuarie 2008 21:36:27
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <stdio.h>
#include <string.h>

const int N_MAX = 100010;

int v[N_MAX], is[N_MAX * 10], cate[N_MAX * 10];

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

	int N, i, MAX = 0, j;

	scanf("%d\n", &N);
	for (i = 1; i <= N; i ++) {
		scanf("%d ", &v[i]);
		is[v[i]] = 1;
		if (v[i] > MAX) MAX = v[i];
	}

	for (i = 2; i <= MAX; i ++) {
		for (j = i; j <= MAX; j += i) {
			cate[i] += is[j];
		}
	}
	memset(is, 0, sizeof(is));

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

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

	for (P = 2; P <= MAX; P ++) {
		if (is[P] >= 0) {
			nrb = is[P];
			if (nrb == 0) nrb = 1;

			if (nrb % 2 == 1) rez += (long long) ((long long) cate[P] * (long long) (cate[P] - 1) / 2);
			else rez -= (long long) ((long long) cate[P] * (long long) (cate[P] - 1) / 2);
		}
	}
	long long kkt;
	kkt = N;
	kkt *= (long long) N - 1;
	kkt /= 2;

	printf("%lld\n", kkt - rez);

	return 0;
}