Cod sursa(job #2376808)

Utilizator CiprianC111Constantinescu Ciprian CiprianC111 Data 8 martie 2019 17:50:16
Problema GFact Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <bits/stdc++.h>

using namespace std;

map<long long, long long> m;

long long nr(long long n, long long p)
{
    long long u = p;
    long long k = 0;
    while(u <= n)
        k += n / u, u *= p;
    return k;
}

long long l(long long n, long long p)
{
    long long st = 0, m, dr = 1LL << 31, l, x;
    while(st <= dr)
    {
        m = st + ((dr - st) >> 1);
        x = nr(m, n);
        if(x == p) return m;
        if(x > p) dr = m - 1, l = m;
        else st = m + 1;
    }
    return l;
}

int main()
{
    freopen("gfact.in", "r", stdin);
    freopen("gfact.out", "w", stdout);
    long long p, q, k = 2;
    scanf("%lld%lld", &p, &q);
    while(p > 1 and 1LL * k * k <= p)
    {
        while(!(p % k)) m[k] += q, p /= k;
        k++;
    }
    if(p > 1) m[p] = q;
    k = -1;
    for(map<long long, long long>::iterator it = m.begin(); it != m.end(); it++)
        k = max(k, l(it -> first, it -> second));
    printf("%lld", k);
    return 0;
}