洛谷 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<cstring> #include<iostream> #include<algorithm> #define mod 1000000007 using namespace std; int n; long long k; long long ans[101][101],t[101][101],r[101][101]; void mul(long long a[101][101],long long b[101][101]){ memset(r,0,sizeof(r)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) r[i][j]+=a[i][k]*b[k][j],r[i][j]%=mod; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j]=r[i][j]; } int main(){ scanf("%d%lld",&n,&k); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ scanf("%lld",&ans[i][j]); t[i][j]=ans[i][j]; } k-=1; for(;k;k>>=1){ if(k&1) mul(ans,t); mul(t,t); } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) cout<<ans[i][j]<<" "; cout<<endl; } }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。