公式
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;
}
投稿日時:
最終更新: