题目描述
求解思路
求解该问题需要注意两点。
- 题目所给ai的取值范围为,然而对于a0 = 1的斐波那契数列,其第31项的大小已经超过了1e6,这意味着再该数列中的第31及以后项都需要修改。
- 题目仅给出了a0 = a1,因此a0 的取值不一定为1。
我们分别打出a0 = 1和a0 = 2的斐波那契数列的前30项。
fib = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657,
46368, 75025, 121393, 196418, 317811, 514229, 832040]
fib1 = [2, 2, 4, 6, 10, 16, 26, 42, 68, 110, 178, 288, 466, 754, 1220, 1974, 3194, 5168, 8362, 13530, 21892, 35422,
57314, 92736, 150050, 242786, 392836, 635622, 1028458, 1664080]
for i in range(30):
print(f'比值{fib[i]/fib1[i]}')
可见两数列的对应位置元素比值都是一定的。
因此我们可以通过使用比值的性质,将题目所给的数列的元素与a0 = 1的斐波那契数列元素相除 ,通过判断相除的结果是否相同,判断出元素是否需要修改。
代码实现
def ques_e():
f = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657,
46368, 75025, 121393, 196418, 317811, 514229, 832040]
n = int(input())
inp = list(map(int, input().split()))
ans = max(0, n - 30)
tim = []
for i in range(min(n, 30)):
tim.append(inp[i] / f[i])
x = 0
tim.sort()
for i in tim:
cnt = 0
for j in tim:
if i - j == 0:
cnt += 1
x = max(x, cnt)
ans += min(n, 30) - x
print(ans)
# fib = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657,
# 46368, 75025, 121393, 196418, 317811, 514229, 832040]
# fib1 = [2, 2, 4, 6, 10, 16, 26, 42, 68, 110, 178, 288, 466, 754, 1220, 1974, 3194, 5168, 8362, 13530, 21892, 35422,
# 57314, 92736, 150050, 242786, 392836, 635622, 1028458, 1664080]
# for i in range(30):
# print(f'比值{fib[i]/fib1[i]}')
#
ques_e()