Cod sursa(job #660238)

Utilizator daniel.dumitranDaniel Dumitran daniel.dumitran Data 11 ianuarie 2012 22:24:49
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define FISIN   "gfact.in"
#define FISOUT  "gfact.out"

int fact[64], exponent[64], nr_div;

bool good(long long f) {
  for (int i = 0; i < nr_div; ++i) {
    long long a = f, e = 0;
    while (a >= fact[i]) {
      a /= fact[i];
      e += a;
    }
    //    printf("(%d : %d %d)\n", f, fact[i], e);
    if (e < exponent[i]) {
      // printf("%d -> BAD (%d)\n", f, fact[i]);
      return false;
    }
  }

  //  printf("%d -> GOOD\n", f);
  return true;
}

int main() {
  FILE *fin = fopen(FISIN, "rt");
  FILE *fout = fopen(FISOUT, "wt");

  int p, q;
  fscanf(fin, "%d %d", &p, &q);
  for (int i = 2; i * i <= p; ++i)
    if (!(p % i)) {
      fact[nr_div] = i;
      for (; !(p % i); exponent[nr_div] += q) p /= i;
      ++nr_div;
    }
  if (p > 1) {
    fact[nr_div] = p;
    exponent[nr_div] = q;
    ++nr_div;
  }

  long long st = 1, en = 2000000000ll * 30000ll, mid;
  for (;;) {
    mid = (st + en) / 2;
    if (!good(mid)) { st = mid + 1; continue; }
    if (!good(mid - 1)) break;
    en = mid - 1;
  }

  fprintf(fout, "%lld\n", mid);

  fclose(fout);
  fclose(fin);
  return 0;
}