Cod sursa(job #2659802)

Utilizator Asgari_ArminArmin Asgari Asgari_Armin Data 17 octombrie 2020 14:25:55
Problema GFact Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <fstream>

using namespace std;

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

const int NMAX = 2000000000;
const int RADMAX = 45000;
const int NRDIVMAX = 30;
int div[NRDIVMAX], e[NRDIVMAX];
int nrdiv;

void desc( int p, int q ){
  int d = 2, cnt;
  while( d * d <= p ){
    cnt = 0;
    while( !(p % d) ){
      ++cnt;
      p /= d;
    }
    if( cnt > 0 ){
      div[nrdiv] = d;
      e[nrdiv++] = cnt * q;
    }
    ++d;
  }
  if( p > 1 ){
    div[nrdiv] = p;
    e[nrdiv++] = q;
  }
}

long long legendre( long long n, int x ){
  long long cnt = 0, val = x;
  while( val <= n ){
    cnt += (n / val);
    val *= x;
  }
  return cnt;
}

bool verif( long long n, int p ){
  int i;
  for( i = 0; i < nrdiv; ++i )
    if( legendre(n, div[i]) < e[i] )
      return 0;
  return 1;
}

int main() {
  long long p, q, dr, st, med;
  fin >> p >> q;

  desc(p, q);
  st = 0; dr = 1LL * NMAX * 30000;
  while( dr - st > 1 ){
    med = (st + dr) >> 1;
    if( verif(med, p) == 0 )
      st = med;
    else
      dr = med;
  }
  fout << dr;
  return 0;
}