问题描述
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
输入格式
输入包含一个整数n。
输出格式
输出一行,包含一个整数,表示Fn除以10007的余数。
样例输入
10
样例输出
55
样例输入
22
样例输出
7704
- 分析思路:
Fibonacci数列,计算到后面出现指数级别的增长,所以要对它进行取模运算
有两种方法:
1.先整体计算后取模,(f(n-1)+f(n-2))%mod;
2.先进行分别取模,之后再取模f(n-1)%mod+f(n-2)%mod;
具体选哪个,看数据范围要求
- 代码:
#include<iostream>
using namespace std;
const int N=1000010;
int f(int n){
if(n==1||n==2) return 1;
return f(n-1)%10007+f(n-2)%10007;
}
int main(){
int n;
cin>>n;
cout<<f(n);
return 0;
}
运行超时,内存空间超出限制,采用下面代码
- 正确代码:
采用数组,不会超时,时间复杂度也变为O(n)
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
long long f[n];
f[0] = 0,f[1] = 1;
for(int i=2;i<=n;i++){
f[i] = (f[i-2]+f[i-1])%10007;
}
cout<<f[n]<<endl;
return 0;
}