Tr A

来源:互联网 发布:淘宝企业店铺注销 编辑:程序博客网 时间:2024/05/16 00:31

Tr A

Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 58   Accepted Submission(s) : 36
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
22 21 00 13 999999991 2 34 5 67 8 9
 

Sample Output
22686
 

Author
xhd
 

Source
HDU 2007-1 Programming Contest
 
#include<stdio.h>#include<stdlib.h>#include<string.h>int res[12][12];int mul(int a[][12], int b[][12],int n, int mod, int c[][12]){int temp[12][12] = { 0 };int i, j,h;for (i = 0; i < n; i++)for (j = 0; j < n; j++)for (h = 0; h < n; h++)temp[i][j] = (temp[i][j] + a[i][h] * b[h][j])%mod;memcpy(c, temp, sizeof(temp));return 0;}int cal(int a[][12], int n, int k, int mod){while (k > 0){if (k & 1)mul(res, a,n, mod, res);mul(a, a,n, mod, a);k >>= 1;}return 0;}int main(){int T, k,n,mod=9973,ans;int a[12][12];int i, j;scanf("%d", &T);while (T--){scanf("%d%d", &n, &k);for (i = 0; i < n; i++)for (j = 0; j < n; j++)scanf("%d", &a[i][j]);for (i = 0; i < n; i++)for (j = 0; j < n; j++)res[i][j] = (i == j);cal(a, n, k, mod);ans = 0;for (i = 0; i < n; i++)ans += res[i][i];printf("%d\n", ans%mod);}return 0;}


0 0
原创粉丝点击