版权声明:本文纯属作者口胡,欢迎转载 https://blog.csdn.net/TQCAI666/article/details/86673441
https://vpn.bupt.edu.cn/http/10.105.242.80/problem/p/96/
reference: https://www.cnblogs.com/cmmdc/p/6936196.html
- 快速幂
ll quickPower(ll a,ll b){
ll ans=1,base=a;
while(b>0){
if(b&1)
ans*=base;
base*=base;
b>>=1;
}
return ans;
}
- 矩阵乘法
matrix* multi(matrix& A, matrix& B){
matrix* C=new matrix;
C->row=A.row;
C->col=B.col;
for(int i=0;i<A.row;i++)
for(int j=0;j<B.col;j++)
for(int k=0;k<A.col;k++)
C->m[i][j]+=A.m[i][k]*B.m[k][j];
return C;
}
- 矩阵快速幂
matrix quickPower(matrix& A,int p){ //A^p
int n=A.col;
//得到单位阵
matrix ans(n,n);//ans=E
FF(i,n)
FF(j,n)
if(i==j)
ans.m[i][j]=1;
else
ans.m[i][j]=0;
//开始快速幂
matrix base=A;
while(p){
if(p&1)
ans=*multi(ans,base);
base=*multi(base,base);
p>>=1;
}
return ans;
}
本题代码
#include <bits/stdc++.h>
#define FF(a,b) for(int a=0;a<b;a++)
#define F(a,b) for(int a=1;a<=b;a++)
#define LEN 100
#define INF 1000000
#define bug(x) cout<<#x<<"="<<x<<endl;
using namespace std;
typedef long long ll;
typedef struct matrix{
int m[LEN][LEN];
int row,col;
matrix(int row,int col):row(row),col(col){}
matrix(){
}
void input(){
FF(i,row)
FF(j,col)
scanf("%d",&this->m[i][j]);
}
void output(){
FF(i,row)
{
FF(j,col)
{
printf("%d",this->m[i][j]);
if(j!=col-1) putchar(' ');
}
printf("\n");
}
}
}matrix;
matrix* multi(matrix& A, matrix& B){
matrix* C=new matrix;
C->row=A.row;
C->col=B.col;
for(int i=0;i<A.row;i++)
for(int j=0;j<B.col;j++)
for(int k=0;k<A.col;k++)
C->m[i][j]+=A.m[i][k]*B.m[k][j];
return C;
}
matrix quickPower(matrix& A,int p){ //A^p
int n=A.col;
//得到单位阵
matrix ans(n,n);//ans=E
FF(i,n)
FF(j,n)
if(i==j)
ans.m[i][j]=1;
else
ans.m[i][j]=0;
//开始快速幂
matrix base=A;
while(p){
if(p&1)
ans=*multi(ans,base);
base=*multi(base,base);
p>>=1;
}
return ans;
}
int main()
{
// freopen("./in","r",stdin);
int N;
scanf("%d",&N);
while(N--){
int n,p;
scanf("%d%d",&n,&p);
matrix A(n,n);
A.input();
quickPower(A,p).output();
}
return 0;
}