Pagini recente » Cod sursa (job #2379339) | Cod sursa (job #3241523) | Cod sursa (job #581455) | Cod sursa (job #2243269) | Cod sursa (job #3185510)
#include <fstream>
#include <vector>
using namespace std;
#define int long long
ifstream cin("gfact.in");
ofstream cout("gfact.out");
vector <pair <int, int>> a;
int p, q, answer;
int valoarePutere(int baza, int valoareFactorial) {
int putere = baza, exponent = 0;
while (putere <= valoareFactorial) {
exponent += valoareFactorial / putere;
putere *= baza;
}
return exponent;
}
bool check(int valoare) {
for (auto iterator : a) {
if (valoarePutere(iterator.first, valoare) < iterator.second) {
return false;
}
}
return true;
}
void read() {
cin >> p >> q;
}
void descompunere() {
if (p % 2 == 0) {
int putere = 0;
while (p % 2 == 0) {
p /= 2;
++putere;
}
a.push_back({ 2, q * putere });
}
for (int divizor = 3; divizor * divizor <= p; divizor += 2) {
if (p % divizor != 0) {
continue;
}
int putere = 0;
while (p % divizor == 0) {
p /= divizor;
++putere;
}
a.push_back({ divizor, q * putere });
}
if (p != 1) {
a.push_back({ p, q });
}
}
void solve() {
int stanga = 0, dreapta = 2e17, mijloc;
while (stanga <= dreapta) {
mijloc = (stanga + dreapta) / 2;
if (check(mijloc)) {
answer = mijloc;
dreapta = mijloc - 1;
continue;
}
stanga = mijloc + 1;
}
}
void display() {
cout << answer;
}
signed main() {
read();
descompunere();
solve();
display();
return 0;
}