Cod sursa(job #2392991)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 30 martie 2019 18:07:51
Problema Fractii Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fin( "fractii.in" );
ofstream fout( "fractii.out" );

const int NMAX = 1000005;

int N;

bool prim[NMAX];
vector <int> prime;

void Read()
{
  fin >> N;

  fin.close();
}

int IndEuler( int val )
{
  int ans = val;

  for( int i = 0; i < prime.size() && prime[i] * prime[i] <= val; ++i )
  {
    if( val % prime[i] == 0 )
    {
      ans -= ans / prime[i];

      while( val % prime[i] == 0 )
        val /= prime[i];
    }
  }

  if( val > 1 )
    ans -= ans / val;

  return ans;
}

void Do()
{
  prim[2] = true;

  for( int i = 3; i <= N; i += 2 )
    prim[i] = true;

  for( int i = 3; i * i <= N; i += 2 )
    if( prim[i] )
      for( int j = 3; i * j <= N; j += 2 )
        prim[i * j] = false;

  prime.push_back( 2 );

  for( int i = 3; i <= N; ++i )
    if( prim[i] ) prime.push_back( i );

  int nr = 0;

  for( int i = 2; i <= N; ++i )
    nr += IndEuler( i );

  nr = nr * 2 + 1;

  fout << nr << '\n';
}

int main()
{
   Read();
   Do();

    return 0;
}