LuoguP3390|模板矩阵快速幂|板子
Posted saitoasuka
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LuoguP3390|模板矩阵快速幂|板子相关的知识,希望对你有一定的参考价值。
目录
快速幂
板子
long long qpow(long long a,long long b){
long long ans=1,base=a;
while(b){
if(b&1) ans=ans*base%c;
base=base*base%c;
b>>=1;
}
return ans%c;
}
矩阵快速幂
Problem
板子
#include <cstdio>
#include <iostream>
#include <cstring>
#define ll long long
using namespace std;
const ll mod=1000000007;
const int maxn=105;
ll n,k;
struct mat{ll m[maxn][maxn];};
mat a;
mat mul(mat a,mat b){
mat c;
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) c.m[i][j]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
c.m[i][j]=c.m[i][j]%mod+a.m[i][k]*b.m[k][j]%mod;
return c;
}
mat qpow(mat a,ll b){
mat ans,base=a;
//构造单位矩阵
//单位矩阵,它从左上角到右下角的对角线上的元素均为1,除此以外全都为0。
//它在矩阵乘中相当于数乘中的1,即任何矩阵乘它都等于本身。
for(int i=1;i<=n;i++) ans.m[i][i]=1;
while(b){
if(b&1) ans=mul(ans,base);
base=mul(base,base);
b>>=1;
}
return ans;
}
int main(){
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%lld",&a.m[i][j]);
mat ans=qpow(a,k);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) printf("%lld ",ans.m[i][j]%mod);
printf("
");
}
return 0;
}
以上是关于LuoguP3390|模板矩阵快速幂|板子的主要内容,如果未能解决你的问题,请参考以下文章