由于
an = an-1 + an-2
所以
an = (1, 1)(an-2, an-1)T
an-1 = (0, 1)(an-2, an-1)T
所以,有变换矩阵
matrix = ((0, 1), (1, 1))
使得
matrix * (an-2, an-1)T = (an-1, an)T
可以观察到,若a0=0,则matrix也可表示为 ((a0, a1), (a1, a2))。
于是构造初始矩阵ret为单位矩阵,经过n次变换ret[0][1]将表示an:
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int> > matrix_mul(vector<vector<int> > m1,
vector<vector<int> >m2) {
vector<vector<int> > tmp = {
{1, 0},
{0, 1}
};
tmp[0][0] = m1[0][0] * m2[0][0] + m1[0][1] * m2[1][0];
tmp[0][1] = m1[0][0] * m2[0][1] + m1[0][1] * m2[1][1];
tmp[1][0] = m1[1][0] * m2[0][0] + m1[1][1] * m2[1][0];
tmp[1][1] = m1[1][0] * m2[0][1] + m1[1][1] * m2[1][1];
return tmp;
}
int main() {
int n;
scanf("%d", &n);
vector<vector<int> > matrix = {
{0, 1},
{1, 1}
};
vector<vector<int> > ret = {
{1, 0},
{0, 1}
};
while (n) {
if (n & 1) {
ret = matrix_mul(matrix, ret);
}
matrix = matrix_mul(matrix, matrix);
n >>= 1;
}
printf("%d\n", ret[0][1]);
}



京公网安备 11010502036488号