zoukankan      html  css  js  c++  java
  • 矩阵的快速幂(含整数的快速幂)

    整数的快速幂

      一个整数的幂 a^b,可以表示将b表示成二进制形式,然后,再把b的每一位数字单独拿出来,进行a的幂运算,然后再相乘。

      举个例子: 

      a^11,11可以表示成1011,

      进而a^11 = 

      

    //x是底数 n是幂指数
    int quickpow(int x,int n){
        int res = x;
        int ans = 1;
        while(n){
            if(n&1) //位运算
                ans = res * ans;
            res = res * res;
         n >>= 1; }
    return ans; }

    矩阵的快速幂

       整体思路与整数的快速幂相同,唯一不同是,我们需要自己写一个矩阵相乘的函数,mul。

    Matrix QuickPow(Matrix x,int n){
        int res = x;
        int ans = 1;
        while(n){
            if(n & 1)
                ans = mul(ans, res);
            res = mul(res, res);
            n >>= 1;
        }
        return ans;
    }
    class Solution {
    public:
        double myPow(double x, int n) {
            long long nn = n;
            if(nn < 0)   x = 1 / x, nn *= -1;
            double ans = 1.0;
            while(nn){
                if(1 & nn){
                    ans *= x;
                }
                x *= x;
                nn >>= 1;
            }
            return ans;
        }
    };

    矩阵快速幂的简单应用

    题目描述

    已知F(n)=F(n-1)+F(n-2), 且F(0) = 0, F(1) = 1,求F(10^1000000)

    解题思路

    可构造矩阵A 使得 [F(n),F(n-1)] = A * [F(n-1),F(n-2)]

    所以[F(n), F(n-1)] = A^(n-1) * [F(n-1),F(n-2)]

    利用矩阵的快速幂求得 A^(n-1),就很容易再求F(n)了

  • 相关阅读:
    WinForm里保存TreeView状态
    动态规划 回溯和较难题
    go 基本链表操作
    leetcode 42接雨水
    leetcode 旋转数组搜索
    leetcode 牛客编程 子序列 树 数组(积累)
    剑指offer(积累)
    go快排计算最小k个数和第k大的数
    leetcode 打家劫舍
    leetcode 字符串相关问题
  • 原文地址:https://www.cnblogs.com/woxiaosade/p/10295408.html
Copyright © 2011-2022 走看看