Cod sursa(job #245613)

Utilizator MarquiseMarquise Marquise Data 18 ianuarie 2009 13:37:53
Problema Sum Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>
#include <math.h>

#define NMAX 100001
#define DMAX (NMAX >> 4) + 1
#define XMAX 70


unsigned char p[DMAX];
int T, N, x[XMAX], num;
long long  R, sum, phi ;



void ciur()
{
	int i, j, lim;

	lim = sqrt(NMAX) + 1;

	for (i = 1; (i << 1) + 1 <= lim; ++i)
		if ( ! ( p[i >> 3] & ( 1 << (i & 7) ) ) )
			for ( j = ( ( i * i) << 1) + ( i << 1) ; (j << 1) + 1 <= lim; j = j + ( i << 1) + 1 )
				p[ j >> 3] = p[j >> 3] | (1 << (j & 7) );


	num = 1;
	x[num] = 2;
	for ( i = 1; (i << 1) + 1 <= lim; i++)
		if ( !( p[i >> 3] & ( 1 << (i & 7) ) ) )
		{
			num++;
			x[num] = ( i << 1) + 1;
		}

}


int main()
{
	int t, i, lim, CN;

	freopen("sum.in", "r", stdin);
	freopen("sum.out", "w", stdout);

	ciur();

	scanf("%d", &T);
	for (t = 1; t <= T; t++)
	{
		scanf("%d", &N);

		phi = N;
		lim = sqrt(N);
		CN = N;

		for ( i = 1; x[i] <= lim && CN > 1; i++)
			if ( CN % x[i] == 0)
			{
				phi = phi / x[i];
				phi = phi * ( x[i] - 1);
				while ( CN > 1 && CN % x[i] == 0)
					CN /= x[i];
			}
		if ( CN > 1)
		{
			phi = phi / CN;
			phi = phi * (CN - 1);
		}

		if ( N % 2 == 0)
			sum = (N / 2 ) * phi;
		else
			sum = N * ( phi / 2);

		R = 2 * sum + N * phi;

		printf("%lld\n", R);


	}

	return 0;
}