HDU

来源:互联网 发布:淘宝售后处理规则 编辑:程序博客网 时间:2024/06/05 05:05

Tr A

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5372    Accepted Submission(s): 4030


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<iostream>#include<stdio.h>#include<string.h>using namespace std;int n,k,T,m,mod = 9973,ans;struct node//该结构体代表一个矩阵{    int a[15][15];    friend node operator * (node a,node b)    {        node c;        for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)            {                c.a[i][j] = 0;                for(int k=0;k<n;k++)                    c.a[i][j] += a.a[i][k]*b.a[k][j],c.a[i][j]%=mod;            }        }        return c;    }}A;node qkm(node A,int m){    node ans,base = A;    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)        {            if(i==j)                ans.a[i][j] = 1;            else                ans.a[i][j] = 0;        }    }    while(m)    {        if(m%2)            ans = ans * base;        base = base * base;        m/=2;    }    return ans;}int main(){    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&n,&k);        m = ans = 0;        for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)            {                scanf("%d",&A.a[i][j]);            }        }        A = qkm(A,k);        for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)            {                if(i==j)                    ans+=A.a[i][j],ans%=mod;            }        }        printf("%d\n",ans);    }    return 0;}


原创粉丝点击