矩阵快速幂 ———— 主要用于求解于斐波那契数列有关的题目。
洛谷1962
请你求出Fn % 1e9 +7 的值。
【数据范围】 1 <= n <= 263
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
const int N = 2, mod = 1e9 + 7;
struct Node
{
int a[N][N];
Node()
{
memset(a, 0, sizeof a);
}
Node operator* (const Node &x)
{
Node res;
for (int i = 0; i < 2; i ++ )
for (int j = 0; j < 2; j ++ )
for (int k = 0; k < 2; k ++ )
res.a[i][j] = (res.a[i][j] + (a[i][k] * x.a[k][j]) % mod) % mod;
return res;
}
};
int n, m;
Node res, mi;
int fbi(int t)
{
while (t)
{
if (t & 1) res = res * mi;
t >>= 1;
mi = mi * mi;
}
return res.a[0][0];
}
int main()
{
res.a[0][0] = res.a[0][1] = mi.a[0][0] = mi.a[0][1] = mi.a[1][0] = 1;
cin >> n;
if (n == 0) cout << 0 << endl;
else if (n == 1) cout << 1 << endl;
else cout << fbi(n - 2) << endl;
return 0;
}
使用矩阵快速幂求得斐波那契数列时
初始化为
1 1 1 1
0 0 1 0
左边为斐波那契数列,所求的的左上角为新的斐波那契数列项。