Cod sursa(job #2872733)

Utilizator Luca_Miscocilucainfoarena Luca_Miscoci Data 17 martie 2022 18:49:45
Problema GFact Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <fstream>
#define int long long
#define NMAX 30000
using namespace std;

int exp[NMAX + 1];
int divp[NMAX + 1];
int nrofd;
int q;

/*int lgput (int x, int n){
  int p = 1;
  while (n){
    if (n&1) p = (p * x) % MOD;
    x = (x * x) % MOD;
    n /= 2;
  }
  return p;
}*/

void desc (int x){ /// E BINE
  int d = 2;
  while (d * d <= x){
    if (x % d == 0){
      divp[nrofd] = d;
      while (x % d == 0)
        exp[nrofd] ++, x /= d;
      nrofd++;
    }
    d ++;
  }
  if (x > 1){
    divp[nrofd] = x;
    exp[nrofd] = 1;
    nrofd ++;
  }
}

int legendre (int n, int d){ /// E BINE
  int tau = 0;
  while (n >= d)
    tau += n / d, n /= d;

  return tau;
}

bool verificare (int n){
  for (int i = 0; i < nrofd; i++){
    if (legendre (n, divp[i]) < exp[i] * q)
      return 0;
  }
  return 1;
}
signed main(){

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

    int p;
    fin >> p >> q;

    desc (p);
    int st = 0, pas = 1LL << 61;
    while (pas > 0){
      if (!verificare (st + pas)) // nu am border
        st += pas;
      pas /= 2;
    }
    fout << st + 1;
    return 0;
}