基准时间限制:3 秒 空间限制:131072 KB 分值: 40
难度:4级算法题
给出一个N * N的矩阵,其中的元素均为正整数。求这个矩阵的M次方。由于M次方的计算结果太大,只需要输出每个元素Mod (10^9 + 7)的结果。
Input
第1行:2个数N和M,中间用空格分隔。N为矩阵的大小,M为M次方。(2 <= N <= 100, 1 <= M <= 10^9)第2 - N + 1行:每行N个数,对应N * N矩阵中的1行。(0 <= N[i] <= 10^9)
Output
共N行,每行N个数,对应M次方Mod (10^9 + 7)的结果。
Input示例
2 31 11 1
Output示例
4 44 4
附上一个矩阵快速幂讲解视频:
点击打开链接
这里补上一个应用篇:
点击打开链接
再补一个快速幂原理的链接:
点击打开链接
视频中用的运算符重载来实现矩阵相乘,作为蒟蒻的我并没有用运算符重载,而是用了一个函数来实现矩阵相乘(看自己习惯)
会了矩阵快速幂后也可以做一下51上的1242和1126 就是矩阵快速幂的具体应用了(需要自己推出一个相应的矩阵)
下面附上自己的代码
#include <iostream>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstring>
using namespace std;
typedef long long ll; //矩阵幂一般都要long long 不然会爆
ll N,M;
const ll mod=1e9+7;
struct mat
{
ll m[105][105]; //结构体存矩阵
};
mat cheng(mat a,mat b) //实现矩阵相乘
{
mat t;
memset(t.m,0,sizeof(t.m));
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
for(int k=0;k<N;k++)
{
t.m[i][j]=(t.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
}
return t;
}
mat quick(mat A,ll n) //矩阵快速幂
{
mat one; //单位矩阵
memset(one.m,0,sizeof(one.m));
for(int i=0;i<N;i++) //单位矩阵赋值
one.m[i][i]=1;
while(n)
{
if(n&1) //处理单乘情况,判断二进制最后一位是否为1
one=cheng(one,A);
A=cheng(A,A);
n=n>>1; 移致下一位
}
return one;
}
int main()
{
ios::sync_with_stdio(false);
cin>>N>>M;
mat result;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
cin>>result.m[i][j];
result=quick(result,M); //result用来存放结果
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
cout<<result.m[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
本文介绍了一种高效计算矩阵M次方的方法——矩阵快速幂,并提供了一个C++实现示例。适用于N*N矩阵的大指数幂计算场景,通过Mod操作避免溢出问题。

被折叠的 条评论
为什么被折叠?



