class Solution { public: int Fibonacci(int n) { if(n == 0) return 0; vector<vector<int>> power{{1, 1}, {1, 0}}; //用于记录当前快速幂 vector<vector<int>> result{{1, 0}, {0, 1}}; //用于记录最终结果 while(n > 0) { // if(n & 1) matrixProduct(result, power); //将n视为二进制取最后一比特,若为1则将对应快速幂乘到结果上 matrixProduct(power, power); //快速幂自乘 n >>= 1; //比特右移 } return result[1][0]; //由于F(1)=1, F(0)=0,直接取[1][0]即可 } void matrixProduct(vector<vector<int>> &m1, vector<vector<int>> m2) { vector<vector<int>> temp = m1; //为了计算时不改变数值拷贝一份m1,计算结果直接在m1里修改 for(int i = 0; i <= 1; i++) { for(int j = 0; j <= 1; j++) m1[i][j] = temp[i][0] * m2[0][j] + temp[i][1] * m2[1][j]; } } };