Mai intai trebuie sa te autentifici.

Cod sursa(job #214224)

Utilizator andrei.12Andrei Parvu andrei.12 Data 13 octombrie 2008 15:29:49
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<stdio.h>

#define lg 1000002

int i, x, mxx, k, j, d[lg], q[100002], ind;
bool este[lg], prim[lg];
long long n, rsp;

inline int max(int a, int b){
	return a > b ? a : b;
}

int main()
{
	freopen("pairs.in", "rt", stdin);
	freopen("pairs.out", "wt", stdout);

	scanf("%lld", &n);
	for (i = 1; i <= n; i ++){
		scanf("%d", &x);

		mxx = max(mxx, x); este[x] = 1;
	}

	for (i = 2; i*i <= mxx; i ++)
		if (!prim[i])
			for (k = 2; k*i <= mxx; k ++)
				prim[k*i] = 1;
	for (i = 2; i <= mxx; i ++)
		if (!prim[i])
			q[++ind] = i;

	for (i = 1; i <= mxx; i ++){
		for (k = 1; i*k <= mxx; k ++)
			if (este[i*k] == 1)
				d[i] ++;
//		rsp += d[i] * (d[i] - 1);
	}
/*
	for (i = 2; i <= mxx; i ++)
		printf("numarul cu %d  %d\n", i, d[i]);
	printf("%d\n", rsp);
*/
	for (i = 2; i <= mxx; i ++){
		d[i] = (d[i] * (d[i] + 1)) / 2;

		int s = 0, nrs = 0;

		for (j = 1; q[j] <= i && j <= ind; j ++)
			if (i % q[j] == 0)
				if ((i / q[j]) % q[j] != 0)
					nrs ++;
				else
					s = 1;

		//printf("pentru %d  %d %d\n", i, nrs, s);
		if (!s)
			if (nrs % 2 == 0){
				rsp -= d[i];
				//printf("scad %d\n", i);
			}
			else{
				rsp += d[i];
				//printf("adaug %d\n", i);
			}
	}

	printf("%lld\n", (n*(n+1)) / 2 - rsp);

	return 0;
}