ABC 280

D - Factorial and Multiple

https://atcoder.jp/contests/abc280/tasks/abc280_d

解説 AC

ルジャンドルの定理と二分探索で解く

ref: 予備ノリ 一度聞いたら忘れない『ルジャンドルの定理』の授業

ll f(ll n, ll p) {
    ll ans = 0;
    ll b = p;
    while (n / b) {
        ans += n / b;
        b *= p;
    }

    return ans;
}

void solve() {
    ll K;
    cin >> K;

    vector<pair<ll, ll>> div;
    {
        ll x = K;
        for (ll i = 2; i * i <= x; i++) {
            if (x % i != 0)
                continue;

            ll cnt = 0;
            while (x % i == 0) {
                x /= i;
                cnt++;
            }
            div.emplace_back(i, cnt);
        }
        if (x != 1)
            div.emplace_back(x, 1);
    }

    ll ac = K, wa = 1;
    while (abs(ac - wa) > 1) {
        ll wj = (ac + wa) / 2;
        ll ok = 1;
        for (auto [p, cnt] : div) {
            if (f(wj, p) < cnt)
                ok = 0;
        }
        if (ok)
            ac = wj;
        else
            wa = wj;
    }

    cout << ac << endl;
}