第二次做這個題了,猶豫再三還是交了,果斷秒A,嘿嘿~感覺不錯啊~
下面說一下思路:
對原矩陣A構造一個2n*2n的方陣。E為單位矩陣,0為0矩陣。
| A E |
| 0 E |
這個矩陣的平方為:
| A^2 A+E |
| 0 E |
右上方的A+E就是A^1+A^0就是前兩項的和。
通過這個構造矩陣的K次方,右上方的N階矩陣就是前K項和,這前K項其實是0-K-1項。
我們要的是1-K項。K++再減去E就是結果了。
話說以前我寫這題用了...... 170line??弱爆了!
#include<iostream>#include<cstdio>#include<string.h>using namespace std;__int64 matrix[66][66];__int64 n,k,mod;void matriXmult( __int64 a[][66],__int64 b[][66] ){ __int64 c[66][66]; memset( c,0,sizeof(c) ); for( int i=0;i<2*n;i++ ) for( int j=0;j<2*n;j++ ) for( int k=0;k<2*n;k++ ) c[i][j]+=a[i][k]*b[k][j]; for( int i=0;i<2*n;i++ ) for( int j=0;j<2*n;j++ ) a[i][j]=c[i][j]%mod;}void matrix_Power( __int64 m[][66],int k ){ k++; __int64 res[66][66],temp[66][66]; memset( res,0,sizeof(res) ); memset( temp,0,sizeof(temp) ); for( int i=0;i<2*n;i++ ){ res[i][i]=1; for( int j=0;j<2*n;j++ ) temp[i][j]=matrix[i][j]; } for( int i=0;i<32;i++ ){ if( k&(1<<i) ) matriXmult( res,temp ); matriXmult( temp,temp ); } for( int i=0;i<2*n;i++ ) for( int j=0;j<2*n;j++ ) if( i==(j-n) ) m[i][j]=(res[i][j]-1+mod)%mod; else m[i][j]=(res[i][j]+mod)%mod;}int main(){ while( scanf("%I64d%I64d%I64d",&n,&k,&mod)!=EOF ) { memset( matrix,0,sizeof(matrix) ); for( int i=0;i<n;i++ ) for( int j=0;j<n;j++ ) scanf( "%I64u",&matrix[i][j] ); for( int i=n;i<2*n;i++ ) matrix[i][i]=matrix[i-n][i]=1; matrix_Power(matrix,k); for( int i=0;i<n;i++ ) { printf( "%I64d",matrix[i][n] ); for( int j=n+1;j<2*n;j++ ) printf( " %I64d",matrix[i][j] ); printf( "\n" ); } } return 0;}