Pagini recente » Cod sursa (job #1689831) | Cod sursa (job #402868) | Istoria paginii runda/lasm09.03.2017 | Cod sursa (job #542892) | Cod sursa (job #433529)
Cod sursa(job #433529)
#include<stdio.h>
#define infile "gfact.in"
#define outfile "gfact.out"
#define nrmax 13131
int a[nrmax]; //a[i]=al i-lea numar prim din descompunere
int b[nrmax]; //b[i]=puterea la care apare
int p,q; //A=p^q
int nr; //numarul de numere prime din descompunerea lui p (implicit si a lui A)
long long x=1; //valoarea B cautata
void read()
{
scanf("%d %d\n",&p,&q);
}
void init()
{
int i;
//il descompunem pe p in factori primi
for(i=2;i*i<=p;i++)
if(p%i==0)
{
a[++nr]=i;
while(p%i==0) b[nr]++,p/=i;
}
if(i<=p) ++nr,a[nr]=p,b[nr]=1;
//ridicam descompunerea la puterea q
for(i=1;i<=nr;i++)
b[i]*=q;
}
int putere(long long x, long long y)
{
long long z=y;
//puterea la care apare y in x!
long long nr=0;
while(z<=x) nr+=x/z,z*=y;
return (int)nr;
}
long long cbin(long long st, long long dr, int x, int y)
{
//cautam binar rezultatul
long long val=0,mij;
while(st<=dr)
{
mij=(st+dr)>>1;
if(putere(mij,x)>=y) val=mij,dr=mij-1;
else st=mij+1;
}
return val;
}
void solve()
{
int i;
for(i=1;i<=nr;i++)
if(putere(x,a[i])<b[i])
x=cbin(x+1,(long long)a[i]*b[i],a[i],b[i]);
}
void write()
{
printf("%lld\n",x);
}
int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
read();
init();
solve();
write();
fclose(stdin);
fclose(stdout);
return 0;
}