Cod sursa(job #2661613)

Utilizator YusyBossFares Yusuf YusyBoss Data 22 octombrie 2020 13:16:00
Problema GFact Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <iostream>
#include <stdio.h>
#include <math.h>
#define PMAX 2000000000
#define QMAX 30000
#define NRDIVPRIMMAX 15

using namespace std;

int put[NRDIVPRIMMAX + 1], div[NRDIVPRIMMAX + 1];

int descfactprim(int n) {
  int i, nrdiv;
  i = 2;
  nrdiv = 0;

  while (i * i <= n && n > 1) {
    while (n % i == 0) {
      n /= i;
      put[nrdiv]++;
    }
    div[nrdiv++] = i;
    i++;
  }

  if (n > 1) {
    put[nrdiv] = 1;
    div[nrdiv++] = n;
  }

  return nrdiv;
}

bool test(long long x, int q, int nrdiv) {
  int i, ok;
  long long cnt;

  ok = 1;
  i = 0;
  while (i < nrdiv && ok == 1) {
    cnt = 0;
    while (x && cnt < q * put[i]) {
      cnt += (long long) x / div[i];
      x /= div[i];
    }
    if (cnt < q * put[i])
      ok = 0;
    i++;
  }

  return ok;
}

long long cautbin(int nrdiv, int q) {
  bool nr;
  long long st, dr, mij, sol;

  st = 1;
  dr = (long long) PMAX * QMAX;
  sol = -1;

  while (st <= dr) {
    mij = (st + dr) / 2;
    nr = test(mij, q, nrdiv);
    if (nr) {
      sol = mij;
      dr = mij - 1;
    }
    else
      st = mij + 1;
  }

  return sol;
}

int main() {
  FILE *fin, *fout;
  int p, q, nrdiv;

  fin = fopen("gfact.in", "r");
  fscanf(fin, "%d%d", &p, &q);
  fclose( fin );

  nrdiv = descfactprim(p);

  fout = fopen("gfact.out", "w");
  fprintf(fout, "%lld", cautbin(nrdiv, q));
  fclose( fout );
  return 0;
}