备战蓝桥杯历年试题:杨辉三角形 省赛B组 Python详解
2022/1/29 22:34:37
本文主要是介绍备战蓝桥杯历年试题:杨辉三角形 省赛B组 Python详解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
导语:距离蓝桥杯70天 该加油就努力 借用路飞哥一句话 不要碌碌无为还安慰自己平凡可贵
直接上图: 题目可以到官网的历年试题中找到
程序设计需具备以下几点知识:
1:了解杨辉三角数对称的性质 以及C(n,m)的计算方法(n下标m上标)
2:会编写组合数函数C(n,m)
3:会二分查找
杨辉三角分析:(手写字不太好看见谅)
!继上面所说的 我们只需要从内行到外行进行遍历
下面确定遍历范围:由于数据范围1<=N<=1000000000
>>> C(32,16)
601080390
>>> C(34,17)
2333606220 所以根据上面所说的 我们只需要掌握到第16斜行即可 因为17斜行最小的元素都大于1000000000 所以不会出现N 18,19..行依次类推所以现在的任务就是 从第16斜行遍历到第1斜行:查找N存在的位置(开始二分查找)
二分查找就需要范围
如何确定:第i斜行 若首个元素(最小元素)C(2i,i)大于N
说明不会出现第i斜行 因为斜行向下递增
若若首个元素(最小元素)C(2i,i)小于N 在该斜行查找
首先 C(n,1)=n 即一定有一个符合输入的N出现在第n行(正行)
其次:斜行上的每一个数字都可以用C(2i,range)来表示
n就是我们要规划的范围 斜行元素最小时 range=i
划重点!斜行元素最大不能超过C(2i,N) 原因在于 第N正行已经存在N 它的右侧元素都大于N
所以正行再往下数就没意义了!
所以我们得到二分的区间范围range∈(i,N)(N<i则不运行)
如果在该斜行没找到就继续向上一个斜行找.....
最糟糕的情况就是找到了第2斜行 N最终还是会出现滴
N=int(input()) def C(a,b):#阶乘函数 res=1 i,j=a,1 while j<=b: res=res*i/j i-=1 j+=1 return int(res) def find(j,N): l,r=2*j,N while l<=r:#二分模板 mid=(l+r)//2 if C(mid,j)==N: print(int(mid*(mid+1)/2)+j+1) return True elif C(mid,j)>N: r=mid-1 else: l=mid+1 return False for i in range(16,-1,-1): if find(i,N): break
如果还有哪里没有讲清楚的欢迎评论留言 这道题还是一道思维题
新年快乐 不忘为算法奋斗!加油
这篇关于备战蓝桥杯历年试题:杨辉三角形 省赛B组 Python详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20Python编程入门指南
- 2024-12-20Python编程基础与进阶
- 2024-12-19Python基础编程教程
- 2024-12-19python 文件的后缀名是什么 怎么运行一个python文件?-icode9专业技术文章分享
- 2024-12-19使用python 把docx转为pdf文件有哪些方法?-icode9专业技术文章分享
- 2024-12-19python怎么更换换pip的源镜像?-icode9专业技术文章分享
- 2024-12-19Python资料:新手入门的全面指南
- 2024-12-19Python股票自动化交易实战入门教程
- 2024-12-19Python股票自动化交易入门教程
- 2024-12-18Python量化入门教程:轻松掌握量化交易基础知识