Pagini recente » Cod sursa (job #1411435) | Cod sursa (job #1520158) | Cod sursa (job #573285) | Cod sursa (job #1096591) | Cod sursa (job #69643)
Cod sursa(job #69643)
#include <stdio.h>
#include <vector>
using namespace std;
#define in "fractii.in"
#define out "fractii.out"
int N, j, r;
int S[31], G[31];
bool ok[1000001];
int phi[1000001];
vector<int> V;
int Solve(int);
int main()
{
freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf("%d", &N);
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++;
}
}
for ( int i = 2; i <= N; i++ )
if ( ok[i] == 0 )
{
phi[i] = i-1;
V.push_back(i);
}
int K, P;
for ( int i = 0; i < V.size(); i++ )
{
K = V[i];
P = K*K;
for ( ; P <= N; )
{
phi[P] = (P-1)*K;
P *= V[i];
}
}
int total=0;
for ( int i = 1; i <= N; i++ )
{
if ( ok[i] == 1 && phi[i] == 0 ) phi[i] = Solve(i);
total += phi[i];
}
printf("%d", 2*total+1);
}
int Solve(int t)
{
r = 0;
int Q = t;
for ( int i = 0; i < V.size() && t > 1; 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];
}
for ( int i = 1; i <= r; i++ )
{
Q /= G[i];
}
for ( int i = 1; i <= r; i++ )
{
Q *= S[i];
}
return Q;
}