Cod sursa(job #111564)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 30 noiembrie 2007 17:43:02
Problema Sum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <stdio.h>

const int N_MAX = 20;

int v[N_MAX], wx;
int divx[N_MAX];

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

	int N, X, i, sum, mx, kkt, c, nrb, p, k;
	for (scanf("%d\n", &N); N; N --) {

		scanf("%d\n", &X);

		divx[0] = 0;
		int wx = X;
		if (X % 2 == 0) {
			divx[++ divx[0]] = 2;
			while (X % 2 == 0) X /= 2;
		}
		for (i = 3; i * i <= wx; i += 2) {
			if (X % i == 0) {
				divx[++ divx[0]] = X;
				while (X % i == 0) X /= i;
			}
		}

		if (X != 1) divx[++ divx[0]] = X;

		sum = 0;
		mx = 1 << divx[0];

		for (c = 1; c < mx; c ++) {

			nrb = 0;

			p = 1;
			for (i = 0; i < 8; i ++) {
				if (c & (1 << i)) {
					p *= divx[i + 1];
					nrb ++;
				}
			}

			if (nrb % 2 == 1) k = 1;
			else k = -1;

			kkt = (2 * wx) / p;
			kkt *= (kkt + 1), kkt /= 2;
			
			p *= kkt;

			sum += k * p;
		}

		printf("%d\n", wx * (2 * wx + 1) - sum);
	}
	return 0;
}