Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

本文介绍了一种高效求解斐波那契数列第n项除以10007的余数的方法。通过简化递归过程并直接计算余数,避免了大数运算和超时问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

直接来程序:

n=int(input())

def fbnq(n):
    if n==1:
        return 1
    elif n==2:
        return 1
    else:
        return (fbnq(n-1)+fbnq(n-2))

def yushu(n):
    a=6765
    b=939
    m=22
    while m<=n:
        r=a+b
        if r>10007:
            r=r%10007
        a,b=b,r
        m+=1
    return b

if n<21:
    print(fbnq(n))
elif n==21:
    print(939)
else:
    print(yushu(n))

这个程序没有超时。
思路是:
1,我们可知道前20个数值是不超过10007的,而且用递归也不费太多时间,所以这种情况直接用递归打印出来。
2,单独打印出n为21时的值,是为了下一步。
3,yushu()函数是为了处理n>21的情况,此时用递归太费时间。我们直接处理除去10007的余数,不管第n项的值是多少。这样比递归节省很多时间。

经过考虑,可以化简程序为:

n=int(input())

def yushu(n):
    a=1
    b=1
    for i in range(n-1):
        a,b=b,(a+b)%10007
    print(a)
yushu(n)

之所以将函数名命名为yushu(),是因为我们的目的是在求余数而不是菲波那切数列本身。

若有更优方案,请指正。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值