题目:
资源限制:
时间限制:1.0s 内存限制:256.0MB
问题描述:
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
输入格式:
输入包含一个整数n。
输出格式:
输出一行,包含一个整数,表示Fn除以10007的余数。
说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要出Fn的准确值结果除以10007先计算取余数,直接计算余数往往比先算,再将计算的出原数再取余简单
样例输入:
10
样例输出:
55
样例输入:
22
样例输出:
7704
数据规模与约定:
1 <= n <= 1,000,000。
思路:
递归思路(倒着来):
n = int(input()) def fibonacci(n): if n == 2 or n == 1 : return 1 return (fibonacci(n-1) + fibonacci(n-2))%10007 Fn = int(fibonacci(n)) print(Fn)
循环遍历:
知识点:
F1 = 1 F2 = 1 #注意以下两种表达的的区别 #表达式1 F1 = F2 F2 = F1 + F2 #此刻F1中的值已经被替换为了F2 #表达式2 F1,F2 = F1 ,(F1+F2) ''' 在这个里面的 F2 = F1+F2 中的F1还是之前F1的值, 并没有被F1 = F2 这半个表达式改变了变量值,因为这是一个语句这个语句 还没有被执行完,所以F1的值还是之前的值 '''
解法:
F1 = 1 F2 = 1 for i in range(0,n-2):#F3需要遍历一次 Fn需要遍历n-2次 F1,F2 = F2,(F1+F2) ''' 将F1看成F2,将F2看成了F3,这里需要注意的是“半个表达式 F2 = F1+F2 ”中的 F1的值还是F1,未被换成F2.因为这个表达式还未被执行完成,python是动态的语言 所以在执行这条语句的时候,可能F1改变的记录可能在缓存,由于未被执行完,还没 放入内存中。 ''' print(F2%10007)
修改:先取余再递推
n=int(input())#键盘读入 F1,F2=1,1 for i in range(3,n+1): F1,F2=F2%10007,(F1+F2)%10007#先取余再递推防止超时 ''' 由于是加法递推,所以很明显先取余再递推和先递推再取余结果是一样的 但是如果数字太大,造成计算时间太长,因此先取余再递推 ''' print(F2)
相关类型题: