1. 程式人生 > >HDU1575(矩陣快速冪模板題)

HDU1575(矩陣快速冪模板題)

簡單的矩陣快速冪,輸入矩陣直接套模板做就行了。
code

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<string>
#include <set>
#include<time.h>
//a&3==a%4
using namespace std ;
#define ll long long
#define mem(a) memset(a,0,sizeof(a))
const double eps = 1e-8; const int maxn = 110010; const int inf = 0x3f3f3f3f; const ll mod=9973ll; struct matrix { ll mat[10][10];//mat[i][j]=µÚiÐеÚjÁÐ matrix() { for(int i=0;i<10;i++) { for(int j=0;j<10;j++) { mat[i][j]=0ll; } } } }; void
out(matrix a,int n) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { cout<<a.mat[i][j]<<" "; } cout<<endl; } } matrix multiply(matrix a,matrix b,int n) { matrix res; for(int i=0;i<n;i++) { for(int j=0
;j<n;j++) { for(int k=0;k<n;k++) { res.mat[i][j]+=a.mat[i][k]*b.mat[k][j]%mod; res.mat[i][j]%=mod; } } } return res; } matrix quickmi(matrix a,ll b,int n) { matrix E; matrix res; for(int i=0;i<n;i++) { E.mat[i][i]=1; res.mat[i][i]=1; } E=multiply(a,E,n); while(b>0) { if(b%2==1) { res=multiply(res,E,n); } b=b/2; E=multiply(E,E,n); } return res; } int main() {; int _case; scanf("%d",&_case); while(_case--) { int n; ll k; matrix sum; scanf("%d",&n); cin>>k; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { ll a; cin>>a; sum.mat[i][j]=a; } } matrix res=quickmi(sum,k,n); ll sumres=0; for(int i=0;i<n;i++) { sumres=(sumres+res.mat[i][i])%mod; } cout<<sumres%mod<<endl; } return 0; }