Pagini recente » Cod sursa (job #856704) | Cod sursa (job #2367361) | Cod sursa (job #2598500) | Cod sursa (job #2865905) | Cod sursa (job #1909627)
#include<cstdio>
using namespace std;
const int NMAX=50;
struct DESC{
int baza,exponent;
};
DESC v[NMAX];
void descompunere(int n, int &ind){
for(int i=0;i<=ind;i++)
v[i].baza=v[i].exponent=0;
int d=2;
ind=0;
while(d*d<=n && n>1){
if(n%d==0){
v[++ind].baza=d;
while(n%d==0){
v[ind].exponent++;
n/=d;
}
}
d++;
}
if(n>1){
v[++ind].baza=n;
v[ind].exponent=1;
}
}
long long legendre(int k, long long n){
long long numitor=k,s=0;
while(numitor<=n){
s+=n/numitor;
numitor*=k;
}
return s;
}
long long bs(int poz){
long long st,dr,med,last=0,ans;
int k=v[poz].baza;
st=1;
dr=1LL<<62;
while(st<=dr){
med=dr-(dr-st)/2;
ans=legendre(k, med);
if(ans>=v[poz].exponent){
last=med;
dr=med-1;
}
else
st=med+1;
}
return last;
}
int main(){
freopen("gfact.in","r",stdin);
freopen("gfact.out","w",stdout);
int ind=0,p,q,poz=0,i;
long long maxx=-1;
scanf("%d%d", &p, &q);
descompunere(p, ind);
for(i=1;i<=ind;i++)
v[i].exponent*=q;
for(i=1;i<=ind;i++){
long long nr=bs(i);
if(nr>maxx)
maxx=nr;
}
printf("%d", maxx);
return 0;
}