Pagini recente » Cod sursa (job #1149329) | Cod sursa (job #1279107) | Cod sursa (job #2609600) | Cod sursa (job #1167748) | Cod sursa (job #3332405)
#include <fstream>
using namespace std;
ifstream cin ("gfact.in");
ofstream cout ("gfact.out");
long long int k, p, q, st, dr, mij, ras, cnt;
struct exponent
{
long long int fact, ex;
} v[101];
bool rasp(long long int x) {
for(long long int i = 1; i <= k; i++)
{
long long int a = v[i].fact;
long long int s = 0;
// Calculam puterea factorului prim in x!
while(x >= a)
{
s += x / a;
// Verificare overflow: daca a * fact ar depasi x, ne oprim.
// Conditia x/fact < a este echivalenta cu x < a * fact
if(x / v[i].fact < a) break;
a = a * v[i].fact;
}
// Verificam daca puterea din x! este suficienta
// Atentie: v[i].ex * q trebuie comparat cu s.
if(s < v[i].ex * q) return 0;
}
return 1;
}
long long int cautare_binara() {
st = 1;
// CORECTIE 1: Folosim sufixul LL pentru a garanta ca e Long Long, nu double.
// 2e18 acopera lejer orice solutie posibila.
dr = 2000000000000000000LL;
ras = dr; // Initializam raspunsul cu maximul posibil
while(st <= dr)
{
mij = (st + dr) / 2;
if(rasp(mij))
{
ras = mij;
dr = mij - 1;
}
else
{
st = mij + 1;
}
}
return ras;
}
int main() {
cin >> p >> q;
// CORECTIE 2: Ai aplicat bine long long aici, il pastram.
for(long long int i = 2; i * i <= p; i++)
{
if(p % i == 0)
{
k++;
v[k].fact = i;
cnt = 0;
while(p % i == 0)
{
p /= i;
cnt++;
}
v[k].ex = cnt;
}
}
if(p != 1)
{
k++;
v[k].fact = p;
v[k].ex = 1;
}
cout << cautare_binara();
return 0;
}