矩阵快速幂

xiaoxiao2021-02-28  113

#include<iostream> #include<cstdio> #include<cstring> const int maxn=100+10; #define ll long long const int b=1000000000+7; using namespace std; ll a[maxn][maxn],s[maxn][maxn],tmp[maxn][maxn]; int main(){ int n;ll k; cin>>n>>k; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ scanf("%lld",&a[i][j]); s[i][j]=a[i][j]; } k--; while(k){ if(k%2){ memset(tmp,0,sizeof(tmp)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++){ tmp[i][j]+=s[i][k]*a[k][j]; tmp[i][j]%=b; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ s[i][j]=tmp[i][j]; } } memset(tmp,0,sizeof(tmp)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++){ tmp[i][j]+=a[i][k]*a[k][j]; tmp[i][j]%=b; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ a[i][j]=tmp[i][j]%b; } k/=2; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) printf("%lld%c",s[i][j],j==n?'\n':' '); return 0; }
转载请注明原文地址: https://www.6miu.com/read-26311.html

最新回复(0)