Pagini recente » Cod sursa (job #1051158) | Cod sursa (job #554280) | Cod sursa (job #1626789) | Cod sursa (job #2850358) | Cod sursa (job #54654)
Cod sursa(job #54654)
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
ifstream in("fractii.in");
ofstream out("fractii.out");
int n;
int pr[78500];
void prime()
{
char a[1000000] = {0};
int cnt = 1;
int p = sqrt(n)+1;
pr[0] = 2;
for ( int i = 3; i <= n; i += 2 )
{
if ( a[i] == 0 )
{
pr[cnt++] = i;
if ( i <= p )
{
for ( int j = (i<<1); j <= n; j += i )
a[j] = 1;
}
}
}
}
int totv[1000000] = {0, 1, 1, 2, 2}; // totv[i] = tot(i)
int tot(int x)
{
int p = x;
int i = 0;
int cnt = 0;
int gasit = 0;
if ( totv[x] != 0 )
return totv[x];
while ( pr[i] < p )
{
if ( p % pr[i] == 0 )
{
gasit = 1;
break;
}
++i;
}
if ( !gasit )
{
totv[x] = x-1;
return totv[x];
}
while ( p % pr[i] == 0 )
{
p /= pr[i];
++cnt;
}
// p = 3, cnt = 1
if ( p == 1 )
//totv[x] = (pr[i]-1)*pow(pr[i], cnt-1);
totv[x] = (pr[i]-1)*(x/pr[i]);
else
totv[x] = (pr[i]-1)*pow(pr[i], cnt-1)*totv[x / (int)pow(pr[i], cnt)];
//totv[x] = (pr[i]-1)*(x/pr[i])*totv[x / (int)pow(pr[i], cnt)];
return totv[x];
}
int main()
{
in >> n;
prime();
long long sol = 0;
int i = 0;
char viz[1000000] = {0};
//
// while ( pr[i] )
// {
// sol += tot(pr[i]);
// viz[i] = 1;
// ++i;
// }
// while ( pr[i] )
// tot(pr[i]), ++i;
while ( pr[i] )
{
sol += tot(pr[i]);
for ( int t = pr[i]+pr[i]; t <= n; t += pr[i] )
{
if ( !viz[t] )
{
int q = tot(t);
//cout << t << " " << q << endl;
sol += q;
if ( q )
viz[t] = 1;
}
}
++i;
}
//cout << tot(n) << endl;
// for ( int j = 2; j <= n; ++j )
// sol += tot(j);
sol = sol*2 + 1;
out << sol << endl;
return 0;
}