矩阵快速幂
对于n方阵的矩阵快速幂
#include<bits/stdc++.h>
#include<vector>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
vector<vector<int> > mul(vector<vector<int> > s1 , vector<vector<int> > s2)
{
vector<vector<int> > ans;
for(int i = 0 ; i < s1.size() ; i ++){
vector<int> sn;
for(int j = 0 ; j < s2[0].size() ; j ++){
int sum = 0;
for(int k = 0 ; k < s2.size() ; k ++){
sum = (s1[i][k]*1ll*s2[k][j]%mod + sum) %mod;
}
sn.push_back(sum);
}
ans.push_back(sn);
}
return ans;
}
vector<vector<int> > binpow(vector<vector<int> > a , ll b)
{
vector<vector<int> > ans(a.size() , vector<int> (a.size()));
for(int i = 0 ; i < a.size() ; i ++) ans[i][i] = 1;
while(b){
if(b & 1) ans = mul(ans,a);
a = mul(a , a);
b >>= 1;
}
return ans;
}
void solve()
{
int n;ll m;
scanf("%d%lld",&n,&m);
vector<vector<int> > q(n,vector<int> (n));
for(int i = 0 ; i < n ; i ++){
for(int j = 0 ; j < n ; j ++){
scanf("%d",&q[i][j]);
}
}
vector<vector<int> > s = binpow(q,m);
for(int i = 0 ; i < n ; i ++){
for(int j = 0 ; j < n ; j ++){
if(j) printf(" ");
printf("%d",s[i][j]);
}
if(i + 1 != n) puts(" ");
}
}
int main()
{
solve();
return 0;
}