Problem Description
A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。
Input
数据的第一行是一个T,表示有T组数据。
每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。
Output
对应每组数据,输出Tr(A^k)%9973。
Sample Input
2
2 2
1 0
0 1
3 99999999
1 2 3
4 5 6
7 8 9
Sample Output
2 2686
矩阵快速幂,我写的是递归调用的
CODE:
#include <iostream> #include <cstdio> #include <cstring> #define REP(i, s, n) for(int i = s; i <= n; i ++) #define REP_(i, s, n) for(int i = n; i >= s; i --) #define MAX_N 10 + 5 #define mod 9973 using namespace std; int n, k; struct node{ int Mtx[MAX_N][MAX_N]; }a; node operator+(node a, node b){ node c; REP(i, 1, n) REP(j, 1, n){ c.Mtx[i][j] = (a.Mtx[i][j] + b.Mtx[i][j]) % mod; } return c; } node operator*(node a, node b){ node c; REP(i, 1, n) REP(j, 1, n){ c.Mtx[i][j] = 0; REP(k, 1, n) c.Mtx[i][j] = (a.Mtx[i][k] * b.Mtx[k][j] + c.Mtx[i][j]) % mod; } return c; } node operator^(node a, int k){ if(k == 0){ REP(i, 1, n) REP(j, 1, n) a.Mtx[i][j] = 1; return a; } if(k == 1) return a; node res = a ^ (k >> 1); if(k & 1) return res * res * a; else return res * res; } int main(){ int T; scanf("%d", &T); while(T --){ scanf("%d%d", &n, &k); REP(i, 1, n) REP(j, 1, n) scanf("%d", &a.Mtx[i][j]); a = a ^ k; int ans = 0; REP(i, 1, n) ans = (ans + a.Mtx[i][i]) % mod; printf("%d\n", ans); } return 0; }
时间: 2024-10-04 20:49:52