P3390 【模板】矩阵快速幂
题目背景
矩阵快速幂
题目描述
给定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
输入输出样例
说明
n<=100, k<=10^12, |矩阵元素|<=1000 算法:矩阵快速幂
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define N 105 #define mod 1000000007 using namespace std; long long n,k; struct Matrix { long long matrix[N][N]; }a; Matrix Matrix_Mul(Matrix a,Matrix b) { Matrix c; for(int i=0;i<n;i++) for(int j=0;j<n;j++) { c.matrix[i][j]=0; for(int k=0;k<n;k++) c.matrix[i][j]=(c.matrix[i][j]+a.matrix[i][k]*b.matrix[k][j])%mod; } return c; } void Matrix_Pow(long long k) { Matrix b=a; while(k>0) { if(k&1) a=Matrix_Mul(a,b); b=Matrix_Mul(b,b); k>>=1; } } int main() { scanf("%lld%lld",&n,&k); for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%lld",&a.matrix[i][j]); Matrix_Pow(k-1); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) printf("%lld ",a.matrix[i][j]); printf("\n"); } return 0; }