题目
分析
矩阵快速幂模板题。
注意的几个点:
优化常数。
还有记得矩阵的初始化需要memset(不知道为什么会wa)
代码
#include<bits/stdc++.h>
using namespace std;
//#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
//char buf[1<<21],*p1=buf,*p2=buf;
template <typename T>
inline void read(T &x){
x=0;char ch=getchar();bool f=false;
while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
x=f?-x:x;
return ;
}
template <typename T>
inline void write(T x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10^48);
return ;
}
#define ll long long
const int N=105;
const ll INF=1e12,MOD=1e9+7;
const double eps=1e-6;
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
int n;
ll m;
inline ll inc(ll x,ll y){return x+y>=MOD?x+y-MOD:x+y;}
struct Matrix{
ll a[N][N];
Matrix(){memset(a,0,sizeof(a));}
inline Matrix operator * (const Matrix &B)const{
Matrix C;
for(int i=1;i<=n;i++){
for(int k=1;k<=n;k++){
ll r=a[i][k];
for(int j=1;j<=n;j++) C.a[i][j]=(C.a[i][j]+r*B.a[k][j])%MOD;
}
}
return C;
}
inline Matrix operator + (const Matrix &B)const{
Matrix C;
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) C.a[i][j]=a[i][j]+B.a[i][j];
return C;
}
inline void print(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) write(a[i][j]),putchar(' ');
putchar('
');
}
return ;
}
};
inline Matrix QuickPow(Matrix x,ll y){
Matrix res;
for(int i=1;i<=n;i++) res.a[i][i]=1;
while(y){
if(y&1) res=res*x;
x=x*x;
y>>=1;
}
return res;
}
signed main(){
read(n);read(m);
Matrix r;
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) read(r.a[i][j]);
Matrix res;
for(int i=1;i<=n;i++) res.a[i][i]=1;
while(m){
if(m&1) res=res*r;
r=r*r;
m>>=1;
}
res.print();
return 0;
}