Pagini recente » Cod sursa (job #701368) | Cod sursa (job #3236748) | Cod sursa (job #3262650) | Cod sursa (job #3188887) | Cod sursa (job #479126)
Cod sursa(job #479126)
#include<iostream>
#include<fstream>
#include<cmath>
#define NMax 1000000
using namespace std;
ifstream fin("fractii.in");
ofstream fout("fractii.out");
long n;
long long fractii, phi[NMax];
char ciur[NMax];
void ciur_eratostene( long x )
{
long i, j;
for ( i = 2; i <= x; i++ )
if ( !ciur[i] )
{
for ( j = 2*i; j <= x; j += i )
ciur[j] = 1;
}
}
long long euler( long x )
{
long x2 = x;
long long nr;
long divizor_prim = 2;
int putere;
if ( x == 1 )
return 1;
//daca x e prim
if ( !ciur[x] )
return x-1;
//daca x nu e prim
while ( x > 1 )
{
putere = 0;
while( x % divizor_prim == 0 )
{
putere++;
x /= divizor_prim;
}
//daca x e de forma p^e, unde p e prim
if ( putere >= 1 && x == 1 )
return (long long) ((divizor_prim - 1) * pow((double)divizor_prim,(double)putere-1));
//daca x e de forma p^e * q, unde (p,q)=1
else if ( putere >= 1 && x != 1 )
{
nr = (long long) pow((double)divizor_prim,(double)putere);
return phi[nr] * phi[x2/nr];
}
divizor_prim++;
while ( ciur[divizor_prim] ) divizor_prim++;
}
}
int main()
{
long i;
fin >> n;
ciur_eratostene( n );
for ( i = 2; i <= n; i++ )
{
phi[i] = euler( i );
fractii += phi[i];
}
fractii = fractii * 2 + 1;
fout << fractii << endl;
fin.close();
fout.close();
return 0;
}