矩阵快速幂
-
快速幂
38 = 3(2^3)
35= 34 + 3*1 -
矩阵快速幂
用于矩阵A的k次幂
A^k
#include<stdio.h>
#define ll long long //多次相乘会溢出,使用Longlong
#define maxn 105
const int mod = 1e9+7;
ll ans[maxn][maxn], a[maxn][maxn]; //存储答案的数组和原始矩阵
void mul2 (int n);
void mul1 (int n);
int main()
{
ll n, k;
scanf ("%lld%lld", &n, &k); //读入数据
for (ll i=1; i<=n; i++)
for (ll j=1; j<=n; j++)
scanf ("%lld", &a[i][j]);
for (ll i=1; i<=n; i++) //初始化为单位矩阵
ans[i][i] = 1;
while (k) //进行快速幂
{
if (k&1)
mul1 (n);
mul2 (n);
k >>= 1;
}
for (ll i=1; i<=n; i++)
{
for (ll j=1; j<=n; j++)
printf ("%lld ", ans[i][j]);
putchar ('\n');
}
}
void mul2 (int n)
{
ll tmp[maxn][maxn] = {0}; //乘之后的结果的存放位置
for (int k=1; k<=n; k++)
for (int j=1; j<=n; j++)
for (int i=1; i<=n; i++)
{
tmp[i][j] = (tmp[i][j] + a[i][k] * a[k][j]) %mod;
}
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
a[i][j] = tmp[i][j];
}
void mul1 (int n)
{
ll tmp[maxn][maxn] = {0}; //乘之后的结果的存放位置
for (int k=1; k<=n; k++)
for (int j=1; j<=n; j++)
for (int i=1; i<=n; i++)
{
tmp[i][j] = (tmp[i][j] + ans[i][k] * a[k][j]) %mod;
}
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
ans[i][j] = tmp[i][j];
}