Pagini recente » Cod sursa (job #2479478) | Cod sursa (job #981468) | Cod sursa (job #2971248) | Cod sursa (job #2520939) | Cod sursa (job #69684)
Cod sursa(job #69684)
#include <stdio.h>
#include <vector>
using namespace std;
#define in "sum.in"
#define out "sum.out"
int n, i, t, rest;
long long int sum;
int j;
int S[21], G[21];
bool ok[100001];
int phi[100001];
vector<int> V;
int Solve(int t);
int main()
{
freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf("%d", &n);
int N = 100000;
for ( int i = 1; i <= N; ++i )
ok[i] = 0, phi[i] = 0;
for ( int i = 2; i <= N; ++i )
{
j = 2;
while ( i*j <= N )
{
ok[i*j] = 1;
j++;
}
}
phi[1] = 1;
for ( int i = 2; i <= N; ++i )
if ( ok[i] == 0 )
{
phi[i] = i-1;
V.push_back(i);
}
long long K, P, T, W;
for ( int i = 0; i < V.size(); ++i )
{
K = V[i];
P = K*K;
for ( ; P <= N; )
{
for ( int a = 1; a*P <= N && a < P; ++a )
{
if ( phi[a] == 0 ) phi[a] = Solve(a);
if ( phi[a] != 0 )
{
phi[P*a] = (V[i]-1)*K*phi[a];
}
}
K = P;
P *= V[i];
}
}
for ( int a = 1; a*P <= N && a < P; ++a )
{
if ( phi[a] == 0 ) phi[a] = Solve(a);
if ( phi[a] != 0 )
{
T = a, W = 1;
while ( T <= N )
{
phi[T] = phi[a]*W;
W = T;
T *= a;
}
}
}
for ( int i = 1; i <= N; ++i )
{
if ( ok[i] == 1 && phi[i] == 0 ) phi[i] = Solve(i);
}
for ( int i = 1; i <= n; i++ )
{
t = 0;
sum = 1;
scanf("%d", &t);
printf("%lld\n", 2*t*phi[t] );
}
}
int Solve(int t)
{
int r = 0, Q = t;
for ( int i = 0; V[i]*V[i] <= Q && t > 1 && i < V.size(); ++i )
{
if ( t % V[i] == 0 ) r+=1, S[r] = V[i]-1, G[r] = V[i];
while ( t % V[i] == 0 ) t /= V[i];
}
if ( t > 1 ) r+=1, S[r] = t-1, G[r] = t;
for ( int i = 1; i <= r; ++i )
{
Q /= G[i];
}
for ( int i = 1; i <= r; ++i )
{
Q *= S[i];
}
return Q;
}