2021年第十二届蓝桥杯省赛C/C++B组题解 试题 H: 杨辉三角形

问题描述

2021年第十二届蓝桥杯省赛C/C++B组题解 试题 H: 杨辉三角形_第1张图片
【评测用例规模与约定】
对于 20% 的评测用例,1 ≤ N ≤ 10;
对于所有评测用例,1 ≤ N ≤ 109

解题思路

由于杨辉三角是关于中间对称的,只要看左半部分就行,中轴上的数为1,2,6,……,也就是 C 2 k k C^k_ {2k} C2kk C 34 17 C^{17}_ {34} C3417大于109,而 C 32 16 C^{16}_ {32} C3216小于109,将左半部分斜着看,可以发现规律越往右下角的斜行,数越大,而且数递增的,那么就可以在每一斜行里用二分查找法找N。

2021年第十二届蓝桥杯省赛C/C++B组题解 试题 H: 杨辉三角形_第2张图片

代码实现

#include
using namespace std;
typedef long long ll;

int N; // 
// 计算组合数C a取b 
int c(int a, int b) {
	ll res = 1;
	for (int i = a, j = 1; j <= b; j++, i--) {
		res = res * i / j;
		// 如果返回值已经大于n,直接返回,防止跳出int范围 ,这样不会影响结果的 
		if (res > N) return res;
	}
	return res;
}
bool check(int k) {
	ll l = 2 * k; // 左边界
	ll r = N; // 右边界
	ll q;
	// 二分查找 
	while (l <= r) {
		long long mid = l + (r - l) / 2;
		q = c(mid, k); // C mid取k
		if (q > N) { r = mid - 1; } // 取左半部分
		else if (q < N) { l = mid + 1; } // 取右半部分
		else {
			cout << (mid + 1) * mid / 2 + k + 1; // 输出N为第几个数
			return true; // 找到返回true
		}
	}
	return false; // 没有找到返回false
}
int main() {
	cin >> N;
	// 从右下角开始向上
	for (int i = 16; i >= 0; i--) {
		if (check(i)) break;
	}
}

你可能感兴趣的:(蓝桥杯,c++,蓝桥杯)