Pagini recente » Cod sursa (job #1761169) | Cod sursa (job #2717724) | Cod sursa (job #1724161) | Cod sursa (job #2778097) | Cod sursa (job #2269948)
#include <cstdio>
using namespace std;
int div[10000] ;
int put[10000] ;
int p, q ;
void divizori(int a) {
int d(2) ;
while (d * d <= a) {
if (!(a % d)) {
div[++ div[0]] = d ;
while (!(a % d))
a /= d, put[div[0]] ++ ;
}
d ++ ;
}
if (a > 1) {
div[++ div[0]] = a ;
put[div[0]] ++ ;
}
}
bool ver(int x) {
long long s(0), k ;
register int i ;
for (i = 1 ; i <= div[0] ; ++ i) {
k = div[i] ;
while (x / k > 0) {
s += x/k ;
k *= div[i] ;
}
if (s < put[i] * q)
return 0 ;
}
return 1 ;
}
int caut(int a, int b) {
int pas(0), L(1 << 20) ;
while (L != 0) {
if (!ver(pas + L))
pas += L ;
L /= 2 ;
}
return pas + 1 ;
}
int main()
{
freopen("gfact.in","r",stdin) ;
freopen("gfact.out","w",stdout) ;
scanf("%d %d", &p, &q) ;
divizori(p) ;
printf("%d",caut(p, q)) ;
return 0;
}