const int MAXN = 110;struct matrax{int M[MAXN][MAXN];} A,per;int n,m;void Init () {for (int i = 0, i < n; ++i) for (int j = 0; J < N; ++j) {scanf ("%d", &a.m[i][j]); A.M[I][J]%= m; PER.M[I][J] = (i = = j); }}matrax Multi (Matrax a,matrax b)//a * b{Matrax C; for (int i = 0, i < n; ++i) for (int j = 0; j < N; ++j) {c.m[i][j] = 0; for (int k = 0; k < N; ++k) c.m[i][j] + = a.m[i][k]*b.m[k][j]; C.M[I][J]%= m; } return C;} Matrax Power (int k)//a^k% m{Matrax C,p,ans = per; p = A; while (k) {if (k&1) ans = Multi (ans,p); p = Multi (p,p); K >>= 1; } return ans; Matrax Add (Matrax A,matrax B)//A + b{Matrax C; for (int i = 0, i < n; ++i) for (int j = 0; j < N; ++j) c.m[i][j] = (A.m[i][j] + b.m[i][j])% m; return c;} Matrax matraxsum (int k)//a + a^2 + a^3+ ... + a^k{if (k = = 1) return A; Matrax temp,b; temp = Matraxsum (K/2); if (k&1) {b = Power (k/2+1); temp = ADD (Temp,multi (temp,b)); temp = ADD (temp,b); } else {b = Power (K/2); temp = ADD (Temp,multi (temp,b)); } return temp;}
Matrix Quick Power "template"