给定一个n
求出这个n第一次出现在杨辉三角形中
是在第几个数字
其中1 <= n <= 1e9
思路:思维题,找规律,不难发现:
(1)首先c(n,1) = n,这说明对于任何一个数n,一定存在在杨辉三角形中;
(2)杨辉三角形左右对称,那么对于任意一个数,它第一次出现的位置必定是在左半边;
(3)对于左半边的杨辉三角形的每一行,都是单调递增的;
(4)对于左半边的杨辉三角形,斜线方向的数都是单调递增的;
那么可以枚举每一条斜线,每一条斜线的起点都是c(2k,k),无限延长,终点我们可以自行设为c(n,k)(一个大于n的数),然后对这条斜线进行二分查找。如果找到,就结束;否则,继续找下一条。
Δ:由于我们要找第一次出现的位置,所以正确的循环方向应该从最下面的一条斜线开始找起!
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
ll 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;
}
ll search(int k)
{
ll l = k * 2,r = n;
while(l <= r)
{
ll mid = l + r >> 1;
if(c(mid,k) > n)
r = mid - 1;
else if(c(mid,k) == n)
return mid * (mid + 1) / 2 + k + 1;
else
l = mid + 1;
}
return -1;
}
int main()
{
cin >> n;
for(int i = 16;i >= 0;i --)
if(search(i) != -1)
{
cout << search(i);
break;
}
return 0;
}