首页 > 代码库 > hdoj 1575 Tr A 【矩阵快速幂】
hdoj 1575 Tr A 【矩阵快速幂】
Tr A
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3020 Accepted Submission(s): 2251
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的内容。
每组数据的第一行有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 <stdio.h> #include <string.h> #define mod 9973 struct node{ int map[15][15]; }; node a, b; int n; node mul(node a, node b){ node c; int i, j, k; for(i = 0; i < n; i ++) for(j = 0; j < n; j ++){ c.map[i][j] = 0; for(k = 0; k < n; k ++) c.map[i][j] += a.map[i][k]*b.map[k][j]; c.map[i][j] %= mod; } return c; } node f(int k, node a){ b = a; k-=1; //将 while(k){ if(k&1) b = mul(b, a); k>>=1; a = mul(a, a); } return b; } int main(){ int t, k; scanf("%d", &t); while(t --){ scanf("%d%d", &n, &k); int i, j; for(i = 0; i < n; i ++){ for(j = 0; j < n; j ++){ scanf("%d", &a.map[i][j]); } } node ans = f(k, a); int res = 0; for(i = 0; i < n; i ++) res += ans.map[i][i]; printf("%d\n", res%mod); } return 0; }
hdoj 1575 Tr A 【矩阵快速幂】
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。