题解
方法一数组
利用fib[i] = fib[i - 1] + fib[i - 2]
即可
方法二递归
主要代码
int f(int n)
{
if(n <= 1) return 1;
return f(n - 1) + f(n - 2);
}
但是这样的话,你会发现算
f
(
5
)
f(5)
f(5) 时算了很多次
f
(
3
)
f(3)
f(3)
所以说我们用一个数组保存计算过的值,若还没有算过,那么再算一遍
改进后的主要代码
int fib[10000010];
int f(int n)
{
if(f[n] != 0) return fib[n];
if(n <= 1) return fib[n] = 1;
return fib[n] = f(n - 1) + f(n - 2);
}
方法三矩阵
就是矩阵的一些运算
代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod (long long)(1e9 + 7)
void multiply(int F[2][2],int M[2][2])
{
int x = F[0][0] * M[0][0] + F[0][1] * M[1][0];
int y = F[0][0] * M[0][1] + F[0][1] * M[1][1];
int z = F[1][0] * M[0][0] + F[1][1] * M[1][0];
int w = F[1][0] * M[0][1] + F[1][1] * M[1][1];
F[0][0] = x % mod;
F[0][1] = y % mod;
F[1][0] = z % mod;
F[1][1] = w % mod;
}
void power(int F[2][2],int n)
{
if(n == 0 || n == 1) return;
int M[2][2] = {{1,1},{1,0}};
power(F,n / 2);
multiply(F,F);
if(n % 2 != 0) multiply(F,M);
}
int fib(int n)
{
int F[2][2] = {{1,1},{1,0}};
if(n == 0) return 0;
power(F,n - 1);
return F[0][0] %= mod;
}
signed main()
{
long long n;
cin >> n;
cout << fib(n) << endl;
return 0;
}