快速幂,矩阵快速幂

快速幂,矩阵快速幂

在这里插入图片描述
分清一维k阶和k维一阶

  1. 一维k阶,比如斐波那契,就是一维二阶,依赖几个同级别就是几阶

下面这个是k维一阶,依赖同级别好几个维度,但是只依赖一个同级别

  1. 两者的矩阵不同,一维k阶是第一竖是系数,后面是一个小一维的矩阵,下面都是0

k维一阶是每个对应每一列竖着的

3.矩阵的幂不同,一维k阶是n-(k-1)的幂,k维1阶是n-1次幂

  1. 最终答案不同,一维k阶,是一维,所以答案就是数组的第一个元素,k维一阶,答案是所有维度的和

注意:vector一定要用传引用作为参数,否则会很慢!!!

乘法快速幂

#include<bits/stdc++.h>
using namespace std;
int power(long long a,long long b,long long mod){
   
   
    long long ans=1;
    while(b > 0){
   
   
        if((b&1)==1){
   
   
            ans=ans*a%mod;
        }
        a=a*a%mod;
        b>>=1;
    }
    return (int)ans;
}
int main(){
   
   
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    long long a,b,p;
    cin>>a>>b>>p;
    cout<<a<<"^"<<b<<" mod "<<p<<"="<<power(a,b,p);
    return 0;
}

矩阵快速幂

在这里插入图片描述
矩阵乘法,枚举ans的每个点,每个点都是运算a一排的大小累加得到的

矩阵的结果是a的行和b的列

#include<bits/stdc++.h>
using namespace std;
vector<vector<int>> multiply(vector<vector<int>>&a,vector<vector<int>>&b){
   
   
    int n=a.size();
    int m=b[0].size();
    int k=a[0].size();
    vector<vector<int>>ans(n,vector<int>(m,0));
    for(int i=0;i<n;i++){
   
   
        for(int j=0;j<m;j++){
   
   
            for(int p=0;p<k;p++){
   
   
                ans[i][j]+=a[i][p]*b[p][j];
            }
        }
    }
    return ans;
}

矩阵快速幂思路和乘法快速幂差不多,矩阵中的单位1是对角全是1,其他都是0

在这里插入图片描述

vector<vector<int>> multiply(vector<vector<int>>&a,vector<vector<int>>&b){
   
   
    int n=a.size();
    int m=b[0].size();
    int k=a[0].size();
    vector<vector<int>>ans(n,vector<int>(m,0));
    for(int i=0;i<n;i++){
   
   
        for(int j=0;j<m;j++){
   
   
            for(int p=0;p<k;p++){
   
   
                ans[i][j]+=a[i][p]*b[p][j];
            }
        }
    }
    return ans;
}
vector<vector<int>> power(vector<vector<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值