第十二届蓝桥杯 Python组 试题 G: 杨辉三角形

  大家好,我叫亓官劼(qí guān jié ),在GitHub 中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在GitHub中写博客,唯一博客更新的地址为:亓官劼的博客 ,近期将逐渐同步刷题相关记录到GitHub:​​Algorithmic-learning-records​​,大多是本人的刷题记录,如果转载请附上原文地址,谢谢。

由于学习工作的需要,算法刷题将会逐渐由C++向Python3过度,正在过度中,如实现的不太优美,请见谅。

本文原创为亓官劼,请大家支持原创,部分平台一直在恶意盗取博主的文章!!!


时间限制: 5.0s 内存限制: 512.0MB

本题总分:20 分

【问题描述】

下面的图形是著名的杨辉三角形:

如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列:

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 ≤ 1000000000。

解题思路

递归,这里只需要保留当行的数值,就可以推出下一行,为了方便计算,可以在两边加0.当数量级到10^10时,当行的数也就100个不到,不会存在内存压力。

算法实现

import math
n = int(input())
if n == 1:
print("1")
else:
a = [0,1,0]
index = 1
flag = True
batch = 1
while flag and batch < 2000:
# batch设为2000的原因:第2000行的第三个数超过10的10次幂,即输入的上限
i = 1
tmp = []
while i < len(a):
t = a[i]+a[i-1]
tmp.append(t)
index += 1
if n == t:
print(index)
flag = False
break
i += 1
tmp.insert(0,0)
tmp.append(0)
a = tmp
batch += 1
if batch == 2000:
# 数在每行的第2,3个,且数比较大,需要特殊处理
tmp = int(math.sqrt(n))
if tmp*(tmp+1) == n*2:
print(int(((1+tmp+1)*(tmp+1))/2+3))
else:
print(int(((1+n)*n)/2+2))