LuoguP3390|【模板】矩陣快速冪|板子
阿新 • • 發佈:2019-01-06
目錄
快速冪
板子
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("\n"); } return 0; }