Cod sursa(job #1972816)
| Utilizator | Data | 23 aprilie 2017 19:19:30 | |
|---|---|---|---|
| Problema | GFact | Scor | 50 |
| Compilator | cpp | Status | done |
| Runda | Arhiva de probleme | Marime | 1.41 kb |
#include <fstream>
using namespace std;
ifstream fin("gfact.in");
ofstream fout("gfact.out");
int i,k,q;
int st,dr,mid;
long long p,b,nrb,maxim;
long long legendre(long long x, long long y)
{
long long sol = 0;
while (x/y != 0)
{
sol += x/y;
y *= y;
}
return sol;
}
int main()
{
fin >> p >> q;
for (i=2; i*i<=p; i++)
if (p%i == 0)
{
int nr = 0;
while (p != 1)
p /= i, nr++;
st = 1;
dr = nr*q;
while (st <= dr)
{
mid = (st+dr)/2;
b = mid*i;
nrb = legendre(b, i);
if (nrb == nr*q)
break;
else
if (nrb < nr*q)
st = mid+1;
else
dr = mid-1;
}
maxim = max(maxim, b);
}
if (p != 1)
{
st = 1;
dr = q;
while (st <= dr)
{
mid = (st+dr)/2;
b = mid*p;
nrb = legendre(b, p);
if (nrb == q)
break;
else
if (nrb < q)
st = mid+1;
else
dr = mid-1;
}
maxim = max(maxim, b);
}
fout << maxim;
return 0;
}
