快速幂

快速幂

  快速幂的实质就是通过合并项来减少幂的运算次数,从而在O(logn)的时间复杂度内完成运算。

  比如:

  

  在这个计算式中,如果不加优化,2^16要计算16次才能得出答案。然而发现这个式子中有很多相同的2*2计算,如果利用计算出的2*2,把所有的2*2项合并起来,然后幂的次数/2,这样就可以优化很多计算,后面类推。

 

复制代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a, b, p;
int main() {
    cin >> a >> b >> p;
    int aa = a, bb = b;
    ll ans = 1;
    while (b) {
        if (b % 2 == 1) {
            ans = (ll)ans * a % p;
        }
        b /= 2;
        a = (ll) a * a % p;
    }
    printf("%d^%d mod %d=%ld\n", aa, bb, p, ans);

    return 0;
}
复制代码

 

 

矩阵快速幂

 1.矩阵乘法

for(i = 1; i <= r; i ++) {
    for(j = 1; j <= c; j ++) {
        mul[i][j] = 0; 
        for(k = 1; k <= c; k ++) { 
            mul[i][j] += a[i][k] * b[k][j]; 
        } 
    } 
} 

 

 2.重载运算符

复制代码
matrix operator *(const matrix &x, const matrix &y) {
     matrix z;
     for(int i = 1; i <= n; i ++) {
         for(int j = 1; j <= n; j ++) {
             for(int k = 1; k <= n; k ++) {
                 z.a[i][j] = (z.a[i][j] + x.a[i][k] * y.a[k][j] % mod) % mod;             
             }
         }
     }     
     return z;
}

复制代码

 

 3.单位矩阵

  误区:单位矩阵是左上右下对角线上元素全为1,并不是所有元素全为1。

复制代码
struct matrix {
    ll a[maxn][maxn];
    matrix() {
        memset(a, 0, sizeof(a));
    }
    //构造单位矩阵 
    inline void build() {
        for(int i = 1; i <= n; i ++) {
            a[i][i] = 1; 
        }
    }
};
复制代码

 

 
 
复制代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 150;
const int mod = 1e9 + 7;
int n;
ll k;

struct matrix {
    ll a[maxn][maxn];
    matrix() {
        memset(a, 0, sizeof(a));
    }
    //构造单位矩阵 
    inline void build() {
        for(int i = 1; i <= n; i ++) {
            a[i][i] = 1; 
        }
    }
}m;

//重载运算符
matrix operator *(const matrix &x, const matrix &y) {
     matrix z;
     for(int i = 1; i <= n; i ++) {
         for(int j = 1; j <= n; j ++) {
             for(int k = 1; k <= n; k ++) {
                 z.a[i][j] = (z.a[i][j] + x.a[i][k] * y.a[k][j] % mod) % mod;             
             }
         }
     }
             
     return z;
}

int main() {
    cin >> n >> k;
    for (int i = 1; i <= n; i ++) {
        for (int j = 1; j <= n; j ++) {
            cin >> m.a[i][j];
        }
    }
    matrix ans;
    ans.build();
    
    while(k) {
        if(k & 1) {//奇数(不能被2整除) 
            ans = ans * m;
        }
        k >>= 1;
        m = m * m;
    }
    
    for(int i = 1; i <= n; i ++) {
        for(int j = 1; j <= n; j ++) {
            cout << ans.a[i][j] << " ";
        }
        cout << "\n";
    }
    
    return 0;
}
复制代码

 

posted @   Y2ZH  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示