本题想要找到最先出现的那个,可以枚举每一个斜行,往往每一个横着的行中间那个数最大,而斜着来,这个数是最小的,中间那个数是C2n n,本题数据最大是1e9,所以开到16就行,利用二分判断,找出那个数,那个数的在第r行,它前面有r * (r + 1) / 2个数,并且它处于这个行的第k + 1 位
代码演示
C++ 代码
//c2n n
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int n;
LL C(int a, int b)
{
LL res = 1;
for (int i = a, j = 1; j <= b; i --, j ++ )
{
res = res * i / j;
if (res > n) return res;
}
return res;
}
bool check(int k)
{
//枚举每斜行,l瞄准中间那个数,r是斜行最后一个数
LL l = k * 2, r = n;
if (l > r) return false;//第一行是特例
while (l < r)
{
LL mid = l + r >> 1;
if (C(mid, k) >= n) r = mid;
else l = mid + 1;
}
if (C(r, k) != n) return false;
cout << r * (r + 1) / 2 + k + 1 << endl;
return true;
}
int main()
{
cin >> n;
for (int k = 16; ; k -- )
if (check(k))
break;
return 0;
}