Cod sursa(job #57298)

Utilizator peanutzAndrei Homorodean peanutz Data 1 mai 2007 18:02:47
Problema Sum Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <stdio.h>
#include <memory.h>

#define NMAX 100001

double p[NMAX];

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

	/*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;
		}

	*/
	p[2] = 2;
	for(i = 3; i < NMAX; i += 2)
	{
		if(p[i] == 0)
			p[i] = i;

		if(p[i-1] == 0)
                	p[i-1] = i-1;

		p[i-1] *= 0.5;

		if(p[i] == i)
		{

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

					p[j] *= d;
				}
		}
		//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;
}