题目描述
下面的图形是著名的杨辉三角形:
如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列: 1,1,1,1,2,1,1,3,3,1,1,4,6,4,1,⋯
给定一个正整数 N,请你输出数列中第一次出现 N 是在第几个数?
输入描述
输入一个整数 N。
输出描述
输出一个整数代表答案。
输入输出样例
示例 1
输入
6
输出
13
评测用例规模与约定
对于 2020 的评测用例,1≤≤N≤10; 对于所有评测用例,1≤N≤1000000000。
答案
# https://www.lanqiao.cn/problems/1457/learning/?page=2&first_category_id=1&sort=students_count
# 杨辉三角形中每个数都可以用组合数来表示
def C(low, high):
if low == 0:
return 1
res = 1
for j in range(low):
res *= (high - j)
for j in range(low):
res //= (j + 1)
return res
def search(k):
# 起始下限,也就是对称轴位置的元素
low = 2 * k
# 终点下限
high = target
# 可能出现high 小于 low 的情况,比如目标值很小,但行数还在十多行的时候。
# 这时候直接判断该斜行第一个元素也就是对称轴位置的元素的值是否是目标值即可。
if high <= low and C(k, low) != target:
return False
while low <= high:
mid = low + (high - low) // 2
val = C(k, mid)
if val > target:
high = mid - 1
elif val < target:
low = mid + 1
else:
# 根据等差数列前N项和公式求出前面有多少个元素,然后再加上他所在的列数
print(int(mid * (mid + 1) / 2) + k + 1)
return True
return False
# 计算中轴线上最大的值
# max_l = 0
# while True:
# temp = C(max_l, 2 * max_l)
# print(temp)
# if temp > 1000000000:
# break
# max_l += 1
# max_l -= 1
max_l = 16
target = int(input())
if target == 1:
print(1)
else:
for i in range(max_l, 0, -1):
if search(i):
break