Pagini recente » Cod sursa (job #109454) | Cod sursa (job #1602475) | Cod sursa (job #140361) | Cod sursa (job #793125) | Cod sursa (job #443227)
Cod sursa(job #443227)
#include <cstdio>
using namespace std;
FILE* fin=fopen("gfact.in","r");
FILE* fout=fopen("gfact.out","w");
typedef unsigned long long uint64;
uint64 p,q,decomp[30][2],nf=0;
inline uint64 num(uint64 a,uint64 k){
uint64 nr=0;
for(uint64 i=a;i<=k;i*=a){
nr+=k/i;
}
return nr;
}
inline uint64 search(uint64 a,uint64 b){
uint64 beg=0LL,end=8446744073709551615LL,last=0LL,mdl;
while(beg<=end){
mdl=beg+((end-beg)>>1LL);
if(num(a,mdl)>=b){
last=mdl,end=mdl-1LL;
}else{
beg=mdl+1LL;
}
}
return last;
}
int main(){
fscanf(fin,"%llu %llu\n",&p,&q);
for(uint64 i=2,k;i*i<=p;++i){
if(p%i==0){
k=0;
while(p%i==0){
k++,p/=i;
}
decomp[nf][0]=i;
decomp[nf][1]=k*q;
nf++;
}
}
if(p>1){
decomp[nf][0]=p;
decomp[nf][1]=q;
nf++;
}
uint64 maxv=0,c=0;
for(uint64 i=0;i<nf;i++){
c=search(decomp[i][0],decomp[i][1]);
if(maxv<c){
maxv=c;
}
}
fprintf(fout,"%llu ",maxv);
fclose(fin);
fclose(fout);
return 0;
}