x
using namespace std;
//1e9
// sn = n*(a1 + an) / 2;
ll C(int n, int m) { //计算组合数C(n, m)
long long ans = 1;
for (int i = 0; i < m; ++i) {
ans *= (n - i);
ans /= (i + 1);
}
return ans;
}
int main() {
ll n;
cin >> n;
int max_col = 0;
for (; C(max_col << 1, max_col) < n; ++max_col); //枚举列,找到 不小于n的 最小列的编号
for (int col = max_col; ~col; --col) { //枚举最大列
if (!col) { //枚举到第0列,是1
cout << "1" << endl;
return 0;
}
if (col == 1) { //特判,到了第一列, 那么就出现在第一列了
cout << pos(n, 1) << endl;
return 0;
}
int row = col << 1; //获取行编号
ll c = C(row, col); //当前列的最小元素
while (c < n) { //枚举该列的行
++row;
c = c * row / (row - col); // == C(row, col); 减小重复计算
//不能这样写 c = c / (row - col) * row;
}
//没有找到
if (c > n) continue;
//找到了
cout << pos(row, col) << endl;
return 0;
}
return 0;
}