Pagini recente » Cod sursa (job #402304) | Cod sursa (job #935442) | Cod sursa (job #1440295) | Cod sursa (job #1834104) | Cod sursa (job #792683)
Cod sursa(job #792683)
#include <cstdio>
#include <algorithm>
#define MAXF 100
using namespace std;
int p, q;
int fact[MAXF], power[MAXF], current;
void desc(int n)
{
int d = 2;
while(n > 1)
{
int p = 0;
while(n > 1 && n%d == 0)
{
n /= d;
++p;
}
if(p > 0)
{
fact[current] = d;
power[current++] = p;
}
++d;
}
}
long long pp(int fact, long long n) //puterea la care apare fact in n!
{
long long rez = 0, t = fact;
while(t <= n)
{
rez += n/t;
t *= fact;
}
return rez;
}
long long bsearch(int poz) //cel mai mic numar b a.i. b! se imparte la fact^power*q
{
long long left, right, m, sol;
sol = 0;
left = 0;
right = power[poz] * q;
while(left <= right)
{
m = (left + right) / 2;
if(pp(fact[poz], m * fact[poz]) >= (long long)power[poz] * q)
{
sol = m;
right = m-1;
}
else
{
left = m+1;
}
}
return sol * fact[poz];
}
int main()
{
freopen("gfact.in", "r", stdin);
freopen("gfact.out", "w", stdout);
scanf("%d %d", &p, &q);
desc(p);
long long sol = -1;
for(int i=0;i<current;++i)
{
sol = max(bsearch(i), sol);
}
printf("%lld", sol);
return 0;
}