公式

H - 和で表現/Magical Sticks Again 解説 by yuto1115

解説

ある整数 \(k\) に対して、\(N\) を相異なる \(k\) 個の整数の和で表せる条件を考えます。まず、\(N\) は最小でも \(1+2+\dots+k=\frac{k(k+1)}{2}\) 以上でなければなりません。逆に \(N\geq \frac{k(k-1)}{2}\) であれば、 \(N = 1 + 2+ \dots + (k-1) + (k+N-\frac{k(k-1)}{2})\) というように相異なる \(k\) 個の整数の和で表せます。よって、\(N\geq \frac{k(k-1)}{2}\) を満たす最大の \(k\) を二分探索によって求めれば良いです。

実装例 (C++)

#include<bits/stdc++.h>

using namespace std;

using ll = long long;

int main() {
    ll N;
    cin >> N;
    ll left = 0, right = 2e9;
    while (left + 1 < right) {
        ll mid = (right + left) / 2;
        if (mid * (mid + 1) / 2 <= N) left = mid;
        else right = mid;
    }
    cout << left << endl;
}

投稿日時:
最終更新: