思路:
代码:
#include <iostream>
using namespace std;
int n;
long long C(int a, int b) {
long long res = 1;
for (int i = a, j = 1; j <= b; i--, j++) {
res = res * i / j;
// 大于n已无意义,且防止爆LL
if (res > n)
return res;
}
return res;
}
bool check(int k) {
// 二分该斜行,找到大于等于该值的第一个数
// 左边界2k,右边界为max(l, n)取二者最大即可!
int l = 2 * k, r = max(n, l);
while (l < r) {
int mid = l + r >> 1;
if (C(mid, k) >= n)
r = mid;
else
l = mid + 1;
}
if (C(r, k) != n)
return false;
// C(r, k)的从0开始的顺序!
cout << 1ll * (r + 1) * r / 2 + k + 1 << endl;
return true;
}
int main() {
cin >> n;
// 从第16斜行枚举即可!
for (int k = 16;; k--)
if (check(k))
break;
return 0;
}