给定一个矩阵A 要求A + A^2 + A^3 +…. A^k;
对于到n的等比矩阵求和
如果n是偶数:
如果n是奇数:

#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxn = 45; int mod = 10; int n, k; struct matrix { int mat[maxn][maxn]; }; matrix mat_add(matrix A, matrix B) { matrix ans; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { ans.mat[i][j] = A.mat[i][j] + B.mat[i][j]; ans.mat[i][j] %= mod; } } return ans; } matrix mat_mul(matrix A, matrix B) { matrix ans; memset(ans.mat, 0, sizeof(ans.mat)); for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { for(int k=0; k<n; k++) { ans.mat[i][j] += A.mat[i][k] * B.mat[k][j]; ans.mat[i][j] %= mod; } } } return ans; } matrix mat_pow(matrix A, int b) { matrix ans; matrix p = A; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { ans.mat[i][j] = (i == j); } } while(b) { if(b & 1) ans = mat_mul(ans, p); p = mat_mul(p, p); b >>= 1; } return ans; } matrix work(matrix A, int m) { if(m == 1) return A; matrix t = work(A, m/2); if(m & 1) { matrix cur = mat_pow(A, m/2+1); t = mat_add(t, mat_mul(t, cur)); t = mat_add(t, cur); } else { matrix cur = mat_pow(A, m/2); t = mat_add(t, mat_mul(t, cur)); } return t; } int main() { while(scanf("%d%d", &n, &k), n) { matrix A; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { int x; scanf("%d", &x); A.mat[i][j] = x % 10; } } matrix ans = work(A, k); for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { printf("%d%c", ans.mat[i][j], j==n-1 ? ' ' : ' '); } } printf(" "); } return 0; }