Time Limit : 6000/3000ms (Java/Other) Memory Limit : 262144/131072K (Java/Other)
Total Submission(s) : 30 Accepted Submission(s) : 17
Problem Description
Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak.
Input
The input contains exactly one test case. The first line of input contains three positive integers n (n ≤ 30), k (k ≤ 109) and m (m < 104). Then follow n lines each containing n nonnegative integers below 32,768, giving A’s elements in row-major order.
Output
Output the elements of S modulo m in the same way as A is given.
Sample Input
2 2 4 0 1 1 1
Sample Output
1 2 2 3#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int n,mod; typedef struct node { __int64 mat[40][40]; }mat; mat A; // 定义 A 与 mat相同的结构体 void In() { for (int i = 0; i < n;i++) for (int j = 0; j < n;j++) { scanf("%I64d", &A.mat[i][j]); } } void out(mat z) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if(j!=n-1)printf("%I64d ",z.mat[i][j]); else printf("%I64d ", z.mat[i][j]); } printf("\n"); } } mat add(mat a, mat b) // 矩阵加法 { mat C; memset(C.mat, 0, sizeof(C.mat)); // 特别注意 等价于 C.mat[i][j] = 0; for (int i = 0; i<n; i++) { for (int j = 0; j<n; j++) { C.mat[i][j] = (a.mat[i][j] + b.mat[i][j]) % mod; } } return C; } mat mul(mat a, mat b) // 矩阵乘法 { mat C; memset(C.mat, 0, sizeof(C.mat)); // 特别注意 等价于 C.mat[i][j] = 0; for (int i = 0; i<n; i++) { for (int j = 0; j<n; j++) { for (int k = 0; k < n; k++) { C.mat[i][j] = (C.mat[i][j] + a.mat[i][k] * b.mat[k][j] % mod) % mod; } } } return C; } mat Pow1(mat A, __int64 k) // 矩阵中元素是矩阵 的幂次方 // 构造这样 { A B1 }^k B1=A;初始化 { // 的矩阵 { 0 B2 } B1=A+A^2+A^3+A^4+.......A^K mat B1, B2, I2, I1; memset(B1.mat, 0, sizeof(B1.mat)); // 单位矩阵初始化 memset(B2.mat, 0, sizeof(B2.mat)); // 单位矩阵初始化 memset(I1.mat, 0, sizeof(I1.mat)); // 单位矩阵初始化 memset(I2.mat, 0, sizeof(I2.mat)); // 单位矩阵初始化 for (int i = 0; i<n; i++) { B2.mat[i][i] = 1; I1.mat[i][i] = 1; I2.mat[i][i] = 1; } int a = 1; B1 = A; while (k>0) { if (k & 1) { if (a) { I1 = mul(I1, A); I2 = mul(I2, B1); a = 0; } else { I2 = add(mul(I1, B1), mul(I2, B2)); I1 = mul(I1, A); } } B1 = add(mul(A, B1), mul(B1, B2)); A = mul(A, A); k = k / 2; } return I2; } int main() { __int64 k; while (scanf("%d %I64d %d", &n, &k, &mod) != EOF) { mat z; In(); memset(z.mat, 0, sizeof(z.mat)); z = Pow1(A, k); // A^1+A^2+A^3+A^4+......A^k out(z); } return 0; }