首页 > 代码库 > HDU - 1575 Tr A
HDU - 1575 Tr A
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的内容。
每组数据的第一行有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
思路:就是一道矩阵乘法快速幂
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MOD = 9973; struct Matrix { int arr[12][12]; }init, unit; int n,k; Matrix Mul(Matrix a, Matrix b) { Matrix c; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) { c.arr[i][j] = 0; for (int k = 0; k < n; k++) c.arr[i][j] = (c.arr[i][j]+(a.arr[i][k]*b.arr[k][j])%MOD)%MOD; } return c; } Matrix Pow(Matrix a, Matrix b, int x) { while (x) { if (x & 1) b = Mul(b, a); x >>= 1; a = Mul(a, a); } return b; } int main() { int t; scanf("%d", &t); while (t--) { scanf("%d%d", &n, &k); for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) { scanf("%d", &init.arr[i][j]); unit.arr[i][j] = init.arr[i][j]; } Matrix res = Pow(init, unit, k-1); int ans = 0; for (int i = 0; i < n; i++) ans = (ans + res.arr[i][i]) % MOD; printf("%d\n", ans%MOD); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。