Cod sursa(job #320266)

Utilizator drag0s93Mandu Dragos drag0s93 Data 4 iunie 2009 10:35:24
Problema Sum Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include<cstdio>

using namespace std;

#define IN "sum.in","r",stdin
#define OUT "sum.out","w",stdout
#define LL long long

int N , A, E;
int V[120];
int sol[1000];
LL sum ;
void back(int k)
{
	if(k == E + 1)
	{
		int prod = 1 , nr = 0;
		for(int i = 1 ; i <= k - 1 ; ++i)
			if(sol[i] == 1){	prod *= V[i];++nr;}
		if (nr == 0)
			return ;
		int n = (2 * A) / prod;
		if(nr % 2 == 0)
			sum -= prod * ((LL)n * (n + 1) / 2);
		else
			sum += prod * ((LL)n * (n + 1) / 2);
		return;
	}
	sol[k] = 1;
	back(k + 1);
	sol[k] = 0;
	back(k + 1);
}
LL solution(int A)
{
	int A1 = A;
	E = 0;
	for(int i = 2 ; i * i <= A ; ++i)
	{
		if(A1 % i == 0)	V[++E] = i;
		while(A1 % i == 0)
			A1 /= i;
	}
	if(A1 != 1)	V[++E] = A1;
	sum = 0;
	back(1);
//	printf("")
	int a = A;
	return (LL)a * (2 * a + 1) - sum;
}
int main()
{
	freopen(IN);
	freopen(OUT);
	scanf("%d",&N);
	for(int i = 1 ; i <= N ; ++i)
	{
		scanf("%d",&A);
		printf("%lld\n",solution(A));
	}
	return 0;
}