Pagini recente » Cod sursa (job #2790858) | Cod sursa (job #290095) | Cod sursa (job #1494958) | Cod sursa (job #1028971) | Cod sursa (job #479345)
Cod sursa(job #479345)
# include <fstream>
# include <cstdio>
# define lint long long
using namespace std;
lint P, Q, desc[100], cnt, du, d, ap[100], i, de[100], ap2[100], cnt2, afis, var, valoare;
lint des (lint P, lint desc[], lint ap[]){
du=P;
cnt=0;
if (du%2==0){
desc[++cnt]=2;
while (du%2==0){
++ap[cnt];
du>>=1;
}
}
d=3;
while (du>1 && d*d<=P){
if (du%d==0){
desc[++cnt]=d;
while (du%d==0){
++ap[cnt];
du=du/d;
}
}
d=d+2;
}
if (du>1){//inseamna ca a ramas nr prim
desc[++cnt]=du;
++ap[cnt];
}
}
lint corect (lint nr, lint put){
//vezi de cate ori apare fiecare component in desc lui nr prin impartire
//ok, let's start ...
lint ret=0;
while (nr){
nr/=put;
ret+=nr;
}
return ret;
}
lint cb (lint in, lint sf, lint i){
lint ret;
while (in<=sf){
int m= (in+sf) >> 1;
if (corect (m, desc[i])>=ap[i]){//search down
ret=m;
sf=m-1;
}
else in=m+1;//else up
}
return ret;
}
int main (){
ifstream f ("gfact.in");
freopen ("gfact.out", "w", stdout);
f>>P>>Q;
des (P, desc, ap);
valoare=1LL << 60;
for (i=1;i<=cnt;++i){
ap[i]=ap[i]*Q;
var=cb (1, valoare, i);
if (afis<var) afis=var;
}
printf ("%lld\n", afis);
return 0;
}