Pagini recente » Borderou de evaluare (job #278301) | Cod sursa (job #2171974) | Cod sursa (job #2966956) | Cod sursa (job #2508117) | Cod sursa (job #1313127)
#include <cstdio>
#include <fstream>
using namespace std;
ifstream f("gfact.in");
ofstream g("gfact.out");
int p,q,sol;
int d[100],e[100],nr;
int t[100];
void desc(int a)
{
int i=2;
while (a!=1) {
if (a%i==0) {
d[++nr]=i;
e[nr]=1;
a/=i;
while (a%i==0) {
a/=i;
e[nr]++;
}
}
else if (i*i>a) {
d[++nr]=a;
e[nr]=1;
a=1;
}
i++;
}
}
bool trying(int a)
{
int i,j;
long long x,y;
for (i=1;i<=nr;i++)
t[i]=0;
for (i=1;i<=nr;i++) {
x=1;
for (j=1;j<=e[i];j++) {
x*=1LL*d[i];
y=1LL*a/x;
if (y==0) break;
t[i]+=y*j;
}
}
for (i=1;i<=nr;i++) if (t[i]<e[i]) return false;
return true;
}
int main()
{
int i,j;
f>>p>>q;
desc(p);
for (i=1;i<=nr;i++)
e[i]*=q;
int st=1,dr=1<<22,mid;
while (st<=dr) {
mid=(st+dr)>>1;
if (trying(mid)==true) {
dr=mid-1;
sol=mid;
}
else st=mid+1;
}
g<<sol;
return 0;
}