矩阵快速幂(大佬们看看我的qwq)
在学习矩阵快速幂之前,首先要了解什么是矩阵
上百度百科:
矩阵是一个按照长方阵列排列的复数或实数集合
形如 n * m m * p的两个矩阵可以进行矩阵乘法,也就是前一个矩阵的行数等于后一个的列数
在相乘时要将对应的行列的对应元素相乘后 相加,得到一个n * p 的矩阵
用公式就是这样
因为太懒所以盗一张大佬的图
那么矩阵快速幂就显而易见,不过是把数换成了矩阵
附上代码和传送门
#include<cstdio> #include<cstring> using namespace std; typedef long long ll; const int mod = 1e9 +7; ll n,k; struct node{ ll a[105][105]; }s,ans; node mul(node x,node y){ node z; memset(z.a,0,sizeof(z.a)); for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j){ for(int k=1;k<=n;++k){ z.a[i][j] += x.a[i][k] * y.a[k][j]; z.a[i][j] %= mod; } } } return z; } void q(ll k){ while(k){ if(k&1)ans = mul(ans,s); s = mul(s,s); k >>= 1; } } int main(){ memset(ans.a,0,sizeof(ans.a)); scanf("%lld%lld",&n,&k); for(int i=1;i<=n;++i){ ans.a[i][i] = 1; for(int j=1;j<=n;++j){ scanf("%lld",&s.a[i][j]); } } q(k); for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j)printf("%lld ",ans.a[i][j]); putchar('\n'); } }
谢谢观看~