Pagini recente » Cod sursa (job #222694) | Cod sursa (job #437292) | Cod sursa (job #1209158) | Cod sursa (job #3309968) | Cod sursa (job #745283)
Cod sursa(job #745283)
#include<iostream>
#include<fstream>
#include<cmath>
using namespace std;
ifstream in("gfact.in");
ofstream out("gfact.out");
long long factori[2100], puteri[2100];
inline int max(int a, int b)
{
return (a > b ? a : b);
}
void desc(int n)
{
long long d = 2, e, lim;
lim = (long long) sqrt(n);
while(d <= lim && n > 1){
e = 0;
while(!(n % d)){
e++;
n /= d;
}
if(e){
factori[ ++factori[0] ] = d;
puteri[ ++puteri[0] ] = e;
}
d++;
}
if(n > 1){
factori[ ++factori[0] ] = n;
puteri[ ++puteri[0] ] = 1;
}
}
long long putere(int p, int n)
{
long long s = 0;
while(n){
s += (n / p);
n /= p;
}
return s;
}
long long binar(int fact, int exp)
{
long long rez, now, med, st = 1, dr = (1 << 60);
while(st <= dr){
med = (st + dr) >> 1;
now = putere(fact, med);
if(now >= exp){
dr = med - 1;
rez = med;
}
else
st = med + 1;
}
return rez;
}
int main()
{
long long p, q, sol = -1, i;
in >> p >> q;
desc(p);
for(i = 1; i <= puteri[0]; ++i)
puteri[i] *= q;
for(i = 1; i <= puteri[0]; ++i)
sol = max(sol, binar(factori[i], puteri[i]));
out << sol;
return 0;
}