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;
}