- 原题
题目背景
矩阵快速幂
题目描述
给定n*n的矩阵A,求A^k
输入输出格式
输入格式:
第一行,n,k
第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素
输出格式:
输出A^k
共n行,每行n个数,第i行第j个数表示矩阵第i行第j列的元素,每个元素模10^9+7
输入输出样例
输入样例#1:
2 1
1 1
1 1
输出样例#1:
1 1
1 1
说明
n<=100, k<=10^12, |矩阵元素|<=1000,算法:矩阵快速幂
2.源代码
#include<iostream>
using namespace std;
typedef long long ll;
ll c = 1000000007;
int n;
struct matrix
{
ll m[120][120];
//需要重载赋值号
void operator = (matrix a)
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
m[i][j] = a.m[i][j];
}
};
matrix mati(matrix a, matrix b,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] = (a.m[i][k] * b.m[k][j])%c + tem.m[i][j];
tem.m[i][j] %= c;
}
return tem;
}
int main()
{
ll k;
cin >> n >> k;
matrix a,ans;
//ans矩阵初始化为单位矩阵,其特点是任何矩阵与其相乘,结果是本身
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
{
cin >> a.m[i][j];
if (i == j)ans.m[i][j] = 1;
else ans.m[i][j] = 0;
}
while (k != 0)
{
if (k & 1)
{
ans = mati(a, ans, n);
}
a = mati(a, a, n);
k = k >> 1;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
cout << ans.m[i][j];
if (j != n)cout << ' ';
}
cout << endl;
}
//system("pause");
return 0;
}
3.原理
快速的思想和普通快速幂一样,两者只有数据类型不一样。