洛谷 P3390 模板矩阵快速幂 题解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P3390 模板矩阵快速幂 题解相关的知识,希望对你有一定的参考价值。
此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。
题目链接:https://www.luogu.org/problem/show?pid=3390
题目背景
矩阵快速幂
题目描述
给定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 算法:矩阵快速幂
重载运算符,然后这题就变成了普通快速幂..美滋滋~
AC代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 6 const int MOD = 1e9+7; 7 8 long long n,k; 9 10 struct Matrix 11 { 12 long long a[105][105]; 13 14 Matrix(){ 15 memset(a,0,sizeof(a)); 16 } 17 18 Matrix operator * (const Matrix &x)const 19 { 20 Matrix r; 21 for(int i = 1;i <= n;++ i) 22 for(int j = 1;j <= n;++ j){ 23 r.a[i][j] = 0; 24 for(int k = 1;k <= n;++ k) 25 r.a[i][j] = (r.a[i][j]+a[i][k]*x.a[k][j]%MOD)%MOD; 26 } 27 28 return r; 29 } 30 }ans,base; 31 32 void ksm() 33 { 34 ans = base; 35 for(long long b = k-1;b;b >>= 1LL) 36 { 37 if(b&1){ 38 for(int i = 1;i <= n;++ i) 39 { 40 for(int j = 1;j <= n;++ j) 41 printf("%lld ",ans.a[i][j]); 42 printf("\n"); 43 } 44 ans = ans*base; 45 } 46 47 base = base*base; 48 } 49 } 50 51 int main() 52 { 53 scanf("%lld%lld",&n,&k); 54 for(int i = 1;i <= n;++ i) 55 for(int j = 1;j <= n;++ j) 56 scanf("%lld",&base.a[i][j]); 57 ksm(); 58 for(int i = 1;i <= n;++ i) 59 { 60 for(int j = 1;j <= n;++ j) 61 printf("%lld ",ans.a[i][j]); 62 printf("\n"); 63 } 64 65 return 0; 66 }
以上是关于洛谷 P3390 模板矩阵快速幂 题解的主要内容,如果未能解决你的问题,请参考以下文章