问题
定义一个数列f(i) = f(i-1)+f(i-2), f(0) = 0, f(1) = 1.
求f(n) mod (1e9+7)
输入数据
一个正整数n,n<=1e5
输出数据
f(n) mod (1e9+7)
样例输入
3
样例输出
2
思路
关键是处理数据过大的问题(1e9+7大约是int的边界)
数学依据:
所以每次对只要每次都对k取模,就能把数据保持在[0,k]内,并且与取模前结果相等。
代码
#include<iostream>
using namespace std;
#define MAX 100010
#define a 1000000007
long long int fvs[MAX]={0};
long long int newfibo2(int n)
{
fvs[0]=0;fvs[1]=1;
for(int i=2;i<=n;i++){
fvs[i]=(fvs[i-1]+fvs[i-2])%a;
}
return fvs[n];
}
int main()
{
int n;
cin>>n;
cout<<newfibo2(n)<<endl;
return 0;
}
#include<iostream>
using namespace std;
#define MAX 100010
#define a 1000000007
long long int fvs[MAX]={0};
long long int newfibo2(int n)
{
fvs[0]=0;fvs[1]=1;
for(int i=2;i<=n;i++){
fvs[i]=(fvs[i-1]%a+fvs[i-2]%a)%a;//对每个数多单独取一次模(可以不要其实)
}
return fvs[n];
}
int main()
{
int n;
cin>>n;
cout<<newfibo2(n)<<endl;
return 0;
}