Matrix Power Series POJ - 3233 (矩陣快速冪)
阿新 • • 發佈:2018-10-31
題意:
題解:
附上程式碼:
#include<iostream> #include<cstdio> using namespace std; typedef long long ll; const int MAXN=70; struct node{ ll a[MAXN][MAXN]; }; node shu,ans,mp; ll N; ll n,kk,mod; node matrix(node x,node y) { for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ mp.a[i][j]=0; for(int p=1;p<=N;p++){ mp.a[i][j]=(mp.a[i][j]+x.a[i][p]*y.a[p][j]+mod)%mod; } } } return mp; } void work(ll k) { for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ ans.a[i][j]=0; } } for(int i=1;i<=N;i++){ ans.a[i][i]=1; } node t=shu; while(k){ if(k&1){ ans=matrix(ans,t); } k>>=1; t=matrix(t,t); } } int main() { scanf("%lld%lld%lld",&n,&kk,&mod); N=2*n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%lld",&shu.a[i][j]); } shu.a[n+i][i]=shu.a[n+i][n+i]=1; } work(kk+1); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ ll a=ans.a[n+i][j]%mod; if(i==j){ a=(a+mod-1)%mod; } printf("%lld%c",a,j==n?'\n':' '); } } return 0; }