Cod sursa(job #57396)

Utilizator peanutzAndrei Homorodean peanutz Data 1 mai 2007 22:23:13
Problema GFact Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <stdio.h>
#include <memory.h>

#define NMAX 1000//01

double p[NMAX];

void ciur()
{
	int i, j;
	double d;

	int prim[] = {3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, -1};

	/*for(j = 4, p[2] = 1; j < NMAX; j += 2)
		{
			p[j] = j;

			p[j-1] = j-1;

			if(j % 2 == 0)
				p[j] *= 0.5;
		}

	*/

	for(i = 2; < NMAX; ++i)
		p[i] = i;

	i = 0;
	while(prim[i] != -1)
	{

		for(j = d = prim[i], d = 1 - (double)1 / d; j < NMAX; j += prim[i])
			{
				if(!p[j])
					p[j] = j;

				p[j] *= d;
			}
		}
		//else
		//	printf("0, ");
		//printf("%ld are %d div primi\n", i, p[i]);
	}
}

int main()
{
	int n, x;

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

	//memset(p, 0, sizeof(p));

	ciur();

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

	while(n--)
	{
		scanf("%d\n", &x);

		printf("%.0lf\n", 2*p[x]*x);
	}

	fclose(stdin);
	fclose(stdout);

	return 0;
}