Pagini recente » Cod sursa (job #1138424) | Cod sursa (job #489147) | Cod sursa (job #2060639) | Cod sursa (job #1122525) | Cod sursa (job #660238)
Cod sursa(job #660238)
#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;
}