快速幂,矩阵快速幂
分清一维k阶和k维一阶
- 一维k阶,比如斐波那契,就是一维二阶,依赖几个同级别就是几阶
下面这个是k维一阶,依赖同级别好几个维度,但是只依赖一个同级别
- 两者的矩阵不同,一维k阶是第一竖是系数,后面是一个小一维的矩阵,下面都是0
k维一阶是每个对应每一列竖着的
3.矩阵的幂不同,一维k阶是n-(k-1)的幂,k维1阶是n-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<