Pagini recente » Cod sursa (job #1387007) | Cod sursa (job #2269640) | Cod sursa (job #2334234) | Cod sursa (job #2033051) | Cod sursa (job #135785)
Cod sursa(job #135785)
#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;
}