1 #include<cstdio> 2 #include<cstring> 3 const int maxn = 100; 4 typedef struct{ 5 long long Mat[maxn][maxn]; 6 }MAT; 7 long long MOD,d; // d是方阵的行数或者列数 8 // 方阵的乘法,模MOD 9 MAT mul(MAT a,MAT b){ 10 MAT c; 11 memset(c.Mat,0,sizeof(c.Mat)); 12 for(int i = 1 ; i <= d ; i++) 13 for(int j = 1 ; j <= d ; j++) 14 for(int k = 1 ; k <= d ; k++) 15 c.Mat[i][j] = (c.Mat[i][j] + a.Mat[i][k] * b.Mat[k][j]) % MOD; 16 return c; 17 } 18 // 方阵快速幂 19 MAT Quick_pow(MAT a,long long b){ 20 MAT c; memset(c.Mat,0,sizeof(c.Mat)); 21 for(int i = 1 ; i <= d ; i++) c.Mat[i][i] = 1; 22 while(b){ 23 if(b & 1) c = mul(c,a); 24 a = mul(a,a); 25 b >>= 1; 26 } 27 return c; 28 }