蓝桥杯Python组真题 杨辉三角

本题数据n的范围10^9说明枚举只能过一部分  

考虑到杨辉三角的性质可以运用二分法和组合数进行解决

 

 

如图可知杨辉三角可以由一系列有规律的组合数组成,由于其左右对称,我们每一行仅取一半即可。从右上角到左下角的每一个斜行按从小到大排列,我们可知到第34行时数据范围就已经超过了10^9,所以斜行最多到r=17,然后对每一个斜行进行二分查找即可。注意遍历时要从大的斜行至小斜行进行遍历。

 

n = int(input())

#求组合数
def com(a,b):
    if b>a:
        return
    num = 1
    c = b
    for i in range(c):
        num *= a/b
        a-=1
        b-=1
    return num

#二分法
def check(i,num):
    l = 2*i
    h = max(l,n)    #l h 表示组合的下标,i表示组合的上标
    mid = (l+h)//2
    sum_ = 0
    while l<h:
        mid = (l+h)//2
        if com(mid,i) >= n:
            h = mid 
        else:
            l = mid + 1
        
    if com(l,i) == n:
        sum_ += (l+1)*l//2
        sum_ += i+1
        return sum_
    else:
        return False
j = 1
for i in range(17,-1,-1):
    if  check(i,j):
        print(check(i,j))
        break
    j +=2 
    

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值