模板题。
#include <cstdio> #include <cstring> #include <iostream> #include <map> #include <algorithm> #include <vector> #include <string> using namespace std; int p[101][101],mat[101][101]; int t; void qmod(int n,int MOD) { int c[101][101],i,j,k; while(n) { memset(c,0,sizeof(c)); if(n&1) { memset(c,0,sizeof(c)); for(i = 0;i < t;i ++) { for(j = 0;j < t;j ++) { for(k = 0;k < t;k ++) { c[i][j] += mat[i][k] * p[k][j]; c[i][j] %= MOD; } } } memcpy(mat,c,sizeof(mat)); } memset(c,0,sizeof(c)); for(i = 0;i < t;i ++) { for(j = 0;j < t;j ++) { for(k = 0;k < t;k ++) { c[i][j] += p[i][k] * p[k][j]; c[i][j] %= MOD; } } } memcpy(p,c,sizeof(p)); n >>= 1; } } int main() { int n,m,k,i,j; while(scanf("%d%d%d",&n,&k,&m)!=EOF) { for(i = 0;i < n;i ++) { for(j = 0;j < n;j ++) scanf("%d",&p[i][j]); } for(i = 0;i < n;i ++) { p[i][i+n] = p[i+n][i+n] = 1; } n <<= 1; for(i = 0;i < n;i ++) { for(j = 0;j < n;j ++) mat[i][j] = (i == j); } t = n; qmod(k+1,m); n >>= 1; for(i = 0;i < n;i ++) { mat[i][i+n] --; if(mat[i][i+n] < 0) mat[i][i+n] += m; } for(i = 0;i < n;i ++) { for(j = 0;j < n;j ++) { if(j == n-1) printf("%d\n",mat[i][j+n]); else printf("%d ",mat[i][j+n]); } } } return 0; }