Pagini recente » Cod sursa (job #1307723) | Borderou de evaluare (job #880812) | Borderou de evaluare (job #2028982) | Borderou de evaluare (job #1133812) | Cod sursa (job #3031077)
#include <bits/stdc++.h>
using namespace std;
int w[100],e[100],n;///numerele prime si exponentii din descompunerea lui p
int P, Q;
ifstream fin("gfact.in");
ofstream fout("gfact.out");
void desc(int z)///desc in factori primi a lui z; z=w[1]^e[1]*...*w[n]^e[n]
{
int d = 2;
n=0;
while (d * d <= z)
{
if (z % d == 0)
{
w[++n] = d;
while(z % d == 0)
{
e[n]++;
z = z/d;
}
}
d++;
}
if (z != 1)///ultimul divizor prim
{
w[++n] = z;
e[n] = 1;
}
}
long long putere(long long u, int p)
{
/// calculeaza x a.i. u=p^x, x maxim, p=numar prim, x=?
long long x;
x=0;
while (u >= p)
{
x = x + u / p;
u=u/p;
}
return x;
}
int verif(long long b)/// daca b! se divide cu w[i]^A, unde A=P^Q
{
int i;
long long ex;
for (i = 1; i <= n; i++)
{
ex = putere(b, w[i]);
if (ex < e[i] * Q)
return 0;
}
return 1;
}
int main()
{
long long st,dr,B,mij;
fin>>P>>Q;;
desc(P);
st = 1;
dr = 6e13+5;
B = -1;
while (st <= dr)
{
mij = (st + dr) / 2;
if (verif(mij))
{
B = mij;
dr = mij - 1;
}
else
st = mij + 1;
}
fout<<B;
return 0;
}