题目描述
下面的图形是著名的杨辉三角形:
如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列: 1,1,1,1,2,1,1,3,3,1,1,4,6,4,1,⋯1,1,1,1,2,1,1,3,3,1,1,4,6,4,1,⋯
给定一个正整数 �N,请你输出数列中第一次出现 �N 是在第几个数?
输入描述
输入一个整数 �N。
输出描述
输出一个整数代表答案。
输入输出样例
示例 1
输入
6
输出
13
评测用例规模与约定
对于 2020 的评测用例,1≤�≤101≤N≤10; 对于所有评测用例,1≤�≤10000000001≤N≤1000000000。
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
解题思路
1(我没敢用)先弄个程序 把可能用范围的表打出来 对输入的N直接找
2 根据斜行枚举 在每个斜行内用二分法查找 每个数一定在16斜行和其之前
如果能找到 printf位置后退出
如果没找到 斜行-1 继续二分找
【蓝桥杯经典数学题】杨辉三角形_蓝桥杯杨辉三角_涅槃豆的博客-CSDN博客
可以根据上述链接里的杨辉三角用组合数表示的图 来理解这个题
代码
#include <stdio.h>
#define LL long long
#define MAX(A, B) (((A) > (B))? (A): (B))
LL N;
LL C(LL n, LL k);
int main(int argc, char* argv[]) {
LL k, i, left, right, mid;
scanf("%lld", &N);
for (k = 16; k >= 0; k--) {
left = 2 * k;
right = MAX(N, left);
while (left <= right) {
mid = (left + right) / 2;
i = C(mid, k);
if (i >= N) right = mid - 1;
else left = mid + 1;
}
if(C(left, k) == N) {
printf("%lld\n", left * (left + 1) / 2 + k + 1);
return 0;
}
}
return 0;
}
LL C(LL n, LL k) {
LL ans = 1, j = 1;
for (; j <= k; n--, j++) {
ans = ans * n / j;
if (ans > N) break;
}
return ans;
}