【C++】21行矩阵快速幂

斐波那契数列

http://www.nowcoder.com/questionTerminal/c6c7742f5ba7442aada113136ddea0c3

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];
        }
    }
};
全部评论

相关推荐

粉红恶魔派星星:炸了,偶遇kpi面。面试官一直在忙自己的事情。1.手写责任链 2.手写快排 3.linux定时任务的命令 4.springboot的定时任务 5.问了一条实习
今天你投了哪些公司?
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务