Cod sursa(job #135785)

Utilizator webspiderDumitru Bogdan webspider Data 14 februarie 2008 15:20:02
Problema Sum Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <stdio.h>
#include <iostream>

using namespace std;

const int maxN = 100001;
const int maxP = 10001;

bool prim[ maxN ];
int np[ maxP ];
int primeF[ maxP ];
int nrP;
int N, X;
int aX;
long long sum;

void back( int fact, int ad, int M, int g ) {
	int mM = ( M / fact );

	if ( ad ) sum += (long long) fact*( (mM*(mM+1))/2 );
	else sum -= (long long) fact*( (mM*(mM+1))/2 );

	for ( int i = g; i <= primeF[0]; i++ ) {
		if ( fact*primeF[i] < M ) {
			back( fact*primeF[i], 1-ad, M, i+1 );
		}
	}
}

int main()
{
	freopen("sum.in","r",stdin);
	freopen("sum.out","w",stdout);
	
	for ( int i = 2; i <= maxN; i++ ) {
		if ( !prim[ i ] ) {
			np[ ++nrP ] = i;
			for ( int j = i+i; j <= maxN; j += i )
				prim[ j ] = 1;
		}
	}


	for ( scanf("%d\n", &N); N; N-- ) {
		scanf("%d\n", &X );
		aX = X;
		sum = 0;
		memset( primeF, 0, sizeof( primeF ) );
		for ( int i = 1; i <= nrP && (X>1); i++ ) {
			if ( !(X % np[ i ]) ) {
				primeF[ ++primeF[0] ] = np[ i ];
				while ( !(X % np[i]) ) {
					X = X/np[i];
				}
			}
		}
		back( 1, 1, 2*aX, 1 );
		printf("%lld\n", sum );

	}

	return 0;
}