解题思路:   事先说明,本题还没有其他人提供python解法,我也没能解决,这个参考代码不能正确通过题目。

                  本题有以下几个难点需要解决:

                (1)简单的递归耗时太长,会导致超时。需要用python的“字典”对递归算法进行优化,实现方式如参考代码第3---7行所示,原理是每计算一个数字,就将该数字存入字典,从而避免重复运算。

                (2)所给数据太大时,递归次数过多,超过了python的最大递归深度。解决方法是重新设定python的最大递归次数,如代码第1---2行所示。

                  188726462599566625    506424146244697409    288796655171361409

                  这组数字是本题提供的三组测试数据之一,经过测试,需要的递归次数在2600和2700之间,因此设置最大递归次数为3000,就不会报错。

                (3)结果数字过大,无法显示。这就是未解决的最后一个问题,尽管解决了递归次数过多的问题,但输入数据过大还是导致结果无法显示,程序进入递归后就会中断运行,不产生输出。

                  如果有同学知道如何解决,希望能在评论区留下方案,感激不尽。

                  PS:可能部分同学不熟悉斐波拉契数列,在这里说明一下,(fun(n+2)-1)是斐波拉契数列的前n项和公式,不用循环相加来计算前n项和是为了减少运行时间。

参考代码:

import sys 
sys.setrecursionlimit(3000)
d ={1:1,2:1}
def fun(n):
    if n in d:
        return d[n]
    else:
        d[n] = fun(n-1) + fun(n-2)
        return d[n]
n, m, p = map(int, input().split())
result = (fun(n+2)-1)%fun(m)%p
print(result)




                十几天后再回来更新一下,这段时间我去leetcode刷到了类似的题,学会了几种新方法,但即使是时间复杂度最低的矩阵快速幂也没法解决数据过大的问题,这道题用python应该是无解的。

                附上矩阵快速幂算法的代码:

def fib(n: int) -> int:
    if n < 2:
        return n
   
    q = [[1, 1], [1, 0]]
    res = matrix_pow(q, n - 1)
    return res[0][0]

def matrix_pow(a: list[list[int]], n: int) -> list[list[int]]:
    ret = [[1, 0], [0, 1]]
    while n > 0:
        if n & 1:
            ret = matrix_multiply(ret, a)
        n >>= 1
        a = matrix_multiply(a, a)
    return ret

def matrix_multiply(a: list[list[int]], b: list[list[int]]) -> list[list[int]]:
    c = [[0, 0], [0, 0]]
    for i in range(2):
        for j in range(2):
            c[i][j] = a[i][0] * b[0][j] + a[i][1] * b[1][j]
    return c

n, m, p = map(int, input().split())
result = (fib(n+2)-1) % fib(m) % p
print(result)

                这些代码在dot运行会报错,但在leetcode和我自己的vscode上是可以运行的。有空大家也可以去刷leetcode,那里的题解更详细,也不会出现某种语言无法解决所给问题的情况,这是leetcode解法的链接https://leetcode-cn.com/problems/fibonacci-number/solution/fei-bo-na-qi-shu-by-leetcode-solution-o4ze/

                另外评论区有同学给出了动态规划算法的代码,是很好的参考。

点赞(0)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 5 条评论

浅墨 2年前 回复TA
@午安 我这几天去leetcode刷到了这道题,贴个链接在这,有三种方法可以用https://leetcode-cn.com/problems/fibonacci-number/solution/fei-bo-na-qi-shu-by-leetcode-solution-o4ze/
午安 2年前 回复TA
@午安 我也是,超限五十
午安 2年前 回复TA
c=0
n,m,p=map(int,input().split())
l=[1]*(n*m)
for i in range(2,n*m-1):
    l[i]=l[i-1]+l[i-2]
for i in range(n):
    c+=l[i]
print(c%l[m-1]%p)
想看大佬题解 2年前 回复TA
@午安 内存超限 枯了
午安 2年前 回复TA
递归变dp来做,可以节省时间