Pagini recente » Cod sursa (job #1578553) | Cod sursa (job #1124141) | Cod sursa (job #2576322) | Cod sursa (job #442424) | Cod sursa (job #2661613)
#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;
}