先看看快速幂
const int mod = 1e9 + 7;
typedef long long ll;
ll ksm(ll a, ll n)
{
ll ans = 1;
while(n)
{
if(n & 1)
ans = ans * a % mod;
n >>= 1;
a = a * a % mod;
}
return ans % mod;
}
快速幂的原理就不解释了, 矩阵快速幂就是把快速幂里整数相乘部分转化为矩阵相乘,本质一样。快速幂掌握之后,矩阵快速幂也能很快掌握。
代码见下:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdio>
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
const int maxn = 1e2 + 10;
const int mod = 1e9 + 7;
typedef long long ll;
struct matrix{
ll m[maxn][maxn];
}a, ans;
matrix multi(matrix x, matrix y, int n)
{
matrix tem;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
tem.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++)
(tem.m[i][j] += x.m[i][k] * y.m[k][j] % mod) %= mod;
return tem;
}
void quick(int n, ll k)
{
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(i == j)
ans.m[i][j] = 1;
else
ans.m[i][j] = 0;
while(k)
{
if(k & 1)
ans = multi(ans, a, n);
a = multi(a, a, n);
k >>= 1;
}
}
int main()
{
int n;
ll k;
cin >> n >> k;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
cin >> a.m[i][j];
quick(n, k);
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
cout << ans.m[i][j] << " ";
cout << endl;
}
return 0;
}