/*
杨辉三角要斜着一行一行的看!!!
第一斜行:C(0,0),C(1,0),C(2,0)...
第二斜行:C(1,1),C(2,1),C(3,1)...
第三斜行:C(2,2),C(3,2),C(4,2)...
观察规律,杨辉三角左右是对称的
从左往右递增,从上到下递增;
每一个斜行也是递增的;
*/
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
int n;
LL C(int a, int b) // 求组合数C(a, b)
{
LL res = 1;
for(int i = a, j = 1; j <= b; i--, j++)
{
res = res * i / j;
}
return res;
}
// 二分求某一斜行是否有等于n的数
LL getAns(int row) // col:列; row:行
{
// 每一个斜行是递增的;
// l在右上方,r在左下方
LL l = row, r = max(row, n); // C(n,1)一定等于n,但不一定是最早出现的位置
while(l < r)
{
LL mid = l + r >> 1;
if(C(mid, row) >= n) r = mid;
else l = mid + 1;
}
if(C(l, row) == n) return (1 + l) * l / 2 + row + 1;
else return 4e18;
}
int main()
{
cin >> n;
if(n == 1) // 特殊情况
{
cout << "1" << endl;
return 0;
}
LL res = 4e18; // 假设的一个很大的数
for(int i = 0; i <= 20; i++) // 枚举前20斜行
{
res = min(res, getAns(i)); // 暴力找最小出现的位置
}
cout << res << endl;
return 0;
}
3418.杨辉三角形
于 2023-12-30 10:45:47 首次发布