0
点赞
收藏
分享

微信扫一扫

luogu3390


​​http://www.elijahqi.win/2017/07/09/luogu3390/​​​
题目背景

矩阵快速幂

题目描述

给定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.矩阵乘法
设A为m×p的矩阵,B为 p×n的矩阵,那么称m×n 的矩阵C为矩阵A与B的乘积,记作 ,其中矩阵C中的第i行第j列元素可以表示为:

例如:

3.矩阵快速幂
套用快速幂 建立结构体

struct matrix{
int f[N][N],l,c;
};

#include <cstdio>
#include <cstring>
#define N 1000000007
struct matrix{
long long f[110][110];
}a,aa;
int n;long long k;
inline matrix multiply(matrix a,matrix b){
matrix c;memset(c.f,0,sizeof(c.f));
//i means line
//j means column
for (int i=1;i<=n;++i){
for (int j=1;j<=n;++j){
for (int z=1;z<=n;++z){
c.f[i][j]+=(long long)a.f[i][z]*b.f[z][j]%N;
c.f[i][j]%=N;
}
}
}
return c;
}
void pow(matrix &a,long long b){
matrix base=a,r=aa;
while (b!=0){
if(b&1) r=multiply(r,base);
base=multiply(base,base);
/*for (int i=1;i<=n;++i){
for (int j=1;j<=n;++j) printf("%d ",base.f[i][j]);
printf("\n");
}*/
b>>=1;
}
a=r;
}
int main(){
freopen("3390.in","r",stdin);
freopen("3390.out","w",stdout);
scanf("%d%lld",&n,&k);
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j) {
scanf("%d",&a.f[i][j]);if (i==j) aa.f[i][j]=1;
}
pow(a,k);
//a=multiply(a,a);
for (int i=1;i<=n;++i){
for (int j=1;j<=n;++j) printf("%d ",a.f[i][j]);
printf("\n");
}
return 0;
}


举报

相关推荐

0 条评论