当前位置: 首页 > news >正文

洛谷 P8749:[蓝桥杯 2021 省 B] 杨辉三角形 ← 组合数 + 二分

【题目来源】
https://www.luogu.com.cn/problem/P8749
https://www.acwing.com/problem/content/3421/

【题目描述】
下面的图形是著名的杨辉三角形:

P8749

如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列:
1,1,1,1,2,1,1,3,3,1,1,4,6,4,1,…
给定一个正整数 N,请你输出数列中第一次出现 N 是在第几个数。

【输入格式】
输入一个整数 N 。

【输出格式】
输出一个整数代表答案。

【输入样例】
6

【输出样例】
13

【数据范围】
对于 20% 的评测用例, 1≤N≤10;
对于所有评测用例, 1≤N≤10^9

【算法分析】
● 杨辉三角(又称帕斯卡三角)是一个由数字排列成的三角形数表,其核心规律是每行首尾均为 1,中间每个数等于它上方两个数之和,本质上是二项式系数的直观排列,是数学与信息学中递推思想的经典模型。

● 杨辉三角是二项式系数在三角形中的一种几何排列。
(1)杨辉三角第 n 行(n≥1)包含 n 个数字,对应二项式 (a+b)ⁿ⁻¹ 展开式的系数。其中,(a+b)ⁿ = C(n,0)aⁿ + C(n,1)aⁿ⁻¹b¹ + C(n,2)aⁿ⁻²b² + … + C(n,n-1)a¹bⁿ⁻¹ + C(n,n)bⁿ。
(2)杨辉三角第 n 行第 k 个数等于组合数 C(n-1,k-1)。其中,C(n,k) = n! ∕ (k!·(n−k)!)。
(3)杨辉三角每行数字左右对称:C(n,k)=C(n,n−k)。
(4)杨辉三角第 n 行的数字和为 2ⁿ⁻¹。
(5)杨辉三角左对齐后,沿‌ 45° 斜线‌(↙方向)的数字和构成斐波那契数列。

杨辉三角与Fibonacci数列的关系

(6)杨辉三角左对齐后,第 i 行第 j 列的数=第 i-1 行第 j-1 列的数+第 i-1 行第 j 列的数。正是组合数性质 C(i, j)=C(i-1, j-1)+C(i-1, j) 的几何体现。

组合公式

● 计算给定数字在杨辉三角中按行优先遍历首次出现的序号(从 1 开始计数
(1)由于杨辉三角的每行数字均呈严格左右对称,且满足组合数性质 C(n,k)=C(n,n−k),因此在计算与构造时,我们仅需关注对称轴左侧的数字即可。
(2)若行号与列号均从 1 开始计数,则杨辉三角第 i 行对称轴上的数可表示为组合数 C(2(i−1), i−1)。显然,图示各行对称轴上的数分别为 C(0,0)=1、C(2,1)=2、C(4,2)=6、C(6,3)=20。
(3)杨辉三角对称轴左侧的数字,在每条左上至右下的斜线(↙)上单调不减,在每条左至右的横线(→)上也单调不减。因此,可以采用二分的思想进行求解。

杨辉三角中数的位置


● 核心代码解析
(1)求组合数 C(a,b)
下面代码基于 C(a,b)=a×(a-1)×…×(a-b+1)/(1×2×…×b) 编写。这是求组合数最稳、最常用的安全写法。

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;
}

(2)由于 C(32,16)≤10^9<C(34,17),所以依据“若行号与列号均从 1 开始计数,则杨辉三角第 i 行对称轴上的数可表示为组合数 C(2(i−1), i−1)”知,所以最多只需要查找 17 斜列即可在题目范围 1e9 内找到对应数字。

【算法代码】

#include <bits/stdc++.h>
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;
}bool check(int k) {LL le=k*2,ri=max(n,le);while(le<ri) {LL mid=le+ri>>1;if(C(mid,k)>=n) ri=mid;else le=mid+1;}if(C(ri,k)!=n) return false;cout<<ri*(ri+1)/2+k+1;return true;
}int main() {cin>>n;int k=16;while(!check(k)) {k--;}return 0;
}/*
in:6
out:13
*/



【参考文献】
https://www.acwing.com/solution/content/179551/
https://blog.csdn.net/hnjzsyjyj/article/details/147570319
https://www.acwing.com/solution/content/167373/
https://www.luogu.com.cn/problem/solution/P8749
https://www.acwing.com/video/2842/
 

http://www.jsqmd.com/news/609036/

相关文章:

  • Python MCP服务器模板还在用Flask硬编码?立即升级——这张含自动证书续签、动态路由注册、灰度发布通道的架构设计图即将下线
  • ESL-CN支持向量机实战:SVM算法原理与代码实现
  • 【DOTS性能跃迁实战手册】:20年Unity架构师亲授C# Job System与Burst编译器协同优化的7个致命误区
  • 五大主流(Coding Agents Compared) AI 编程代理‌ 比较
  • RMBG-1.4模型微调教程:针对特定场景的优化方法
  • 为什么 延迟渲染前向渲染
  • Cuvil编译器不是另一个TVM!它用LLVM+MLIR定制Python-first IR,让ResNet50推理延迟压进8.4ms(附源码级性能剖析)
  • LangChain4j核心接口使用(四)Tool和MCP(3)MCP Client
  • 20252818 2025-2026-2 《网络攻防实践》第三周作业
  • 利率曲线构建终极指南:掌握 tf-quant-finance 中的 Hagan-West 算法和单调凸插值
  • 动态数据源与ZooKeeper集成:构建企业级配置中心的终极指南
  • 10个知名网站HTML压缩实战:html-minifier性能优化终极指南
  • 智选未来空间:2025年河北数字展厅展示设计公司企业择优选择
  • DotNetPy:现代.NET 与 Python 互操作 实战指南捉
  • KIHU快狐|49寸户外触摸查询机3000亮度银行用
  • 【PyO3 × GraalVM × CPython 3.14原生AOT三重验证】:2026唯一通过PEP 718认证的配置流程
  • Lobe Theme 国际化支持:如何为你的语言贡献翻译
  • AI + Cybersecurity
  • 虚拟线程调度失灵、协程泄漏、监控断连——Java 25高并发架构崩塌前的5个预警信号,速查!
  • 别再死记硬背公式了!用MATLAB Simulink从零搭建一阶倒立摆模型(附完整.m文件)
  • 新手避坑指南:用Seurat分析单细胞数据时,这5个参数设置错误最要命
  • 三步掌握FullCalendar Vue3组件:从入门到场景化落地
  • 如何让求职效率提升300%?NewJob智能插件帮你避开90%的无效岗位
  • ESP32-CAMERA官方例程在S3开发板上不工作?手把手教你排查引脚与PSRAM配置
  • 谷歌 2026-完整的 AI 帝国蓝图
  • 开源项目管理工具Taskcafe完整贡献指南:7步加入看板协作开发
  • gh_mirrors/resum/resume字体系统详解:Adobe中文字体与FontAwesome图标集成
  • 线性代数别死记!用Python的NumPy库5分钟搞定向量线性相关性判断
  • Blue Topaz主题:10分钟打造你的专属Obsidian蓝色笔记空间
  • doT.js测试终极指南:如何编写高质量的模板测试用例