Mai intai trebuie sa te autentifici.
Cod sursa(job #1536098)
Utilizator | Data | 25 noiembrie 2015 18:14:32 | |
---|---|---|---|
Problema | GFact | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.02 kb |
#include <cstdio>
#include <algorithm>
#include <climits>
#define maxN 200005
using namespace std;
long long p, q, i, sol, m;
long long legendre(long long n, long long f)
{
long long pf=f, sum=0;
while(pf <= n)
sum += n/pf, pf *= f;
return sum;
}
long long cb(long long f,long long pt)
{
long long st=1, dr=1<<30;
dr*=dr;
while(st <= dr)
{
m = (st+dr)/2;
if(legendre(m, f) >= pt)
dr = m - 1;
else st = m+1;
}
m=(st+dr)/2;
if(legendre(m,f) < pt)
m++;
return m;
}
int main()
{
freopen("gfact.in", "r", stdin);
freopen("gfact.out", "w", stdout);
scanf("%lld %lld", &p, &q);
long long d=2;
long long aux=p;
while(d * d <= aux)
{
long long exp=0;
while(aux%d == 0)
exp++, aux /= d;
if(exp)
sol = max(sol, cb(d, exp*q));
d++;
}
if(aux!=1)
sol = max(sol, cb(aux, q));
printf("%lld", sol);
return 0;
}