• HDU 1575 Tr A


    Tr A

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)


    Total Submission(s): 93    Accepted Submission(s): 78


    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
     

    Author
    xhd
     

    Source
     

    Recommend
    linle
     

     
    Statistic | Submit | Back

    //1354591 2009-05-10 10:11:59 Accepted 1575 0MS 268K 1362 B C++ Wpl 
    #include <iostream>
    #define MAX 11
    using namespace std;
    typedef 
    struct node
    {
        
    int matrix[MAX][MAX];
    //    int nn,mm;    //m代表行,n代表列
    }Matrix;
    Matrix init,unit;  
    //分别定义init为初始的输入矩阵,unit为单位矩阵
    int n,kk;
    void Init()
    {
        
    int i,j;
        scanf(
    "%d%d",&n,&kk);
        
    for(i=0;i<n;i++)
            
    for(j=0;j<n;j++)
            {
                scanf(
    "%d",&init.matrix[i][j]);  //输入初始矩阵
                unit.matrix[i][j]=(i==j);  //初始化初始矩阵
            }
    }
    Matrix Mul(Matrix a,Matrix b)
    //据说传结构体比传数组快
    {
        
    int i,j,k;
        Matrix c;
        
    for(i=0;i<n;i++)
            
    for(j=0;j<n;j++)
            {
                c.matrix[i][j] 
    = 0;
                
    for(k=0;k<n;k++)
                    c.matrix[i][j] 
    += a.matrix[i][k]*b.matrix[k][j];
                c.matrix[i][j]
    %=9973;
            }
        
    return c;
    }
    Matrix Cal(
    int k)//k代表幂,这里是利用二分法求矩阵的幂
    {
        Matrix p,q;
        p 
    = unit;   //p为单位矩阵
        q = init;   //q为初始矩阵
        while(k!=1)
        {
            
    if(k&1)  //k是奇数
            {
                k
    --;
                p 
    = Mul(p,q);  //如果k是奇数,那么就不能进行平均的二分,所以让p乘以一个单位矩阵,保证其不变,然后k--就可以进行二分了
            }
            
    else  //k是偶数
            {
                k
    >>=1;  //k除2
                q = Mul(q,q);
            }
        }
        p 
    = Mul(p,q);
        
    return p;
    }
    int main()
    {
        Matrix r;
        
    int t;
        cin
    >>t;
        
    while(t--)
        {
            Init();
            r
    =Cal(kk);
            
    int i,j,sum;
            i
    =0;
            sum
    =0;
            
    while(i<n)
            {
                sum
    +=r.matrix[i][i];
                sum
    %=9973;
                i
    ++;
            }
            printf(
    "%d\n",sum);
        }
        
    return 0;
    }
  • 相关阅读:
    【TIDB】2、TIDB进阶
    【TIDB】1、TiDb简介
    【Tair】淘宝分布式NOSQL框架:Tair
    【ElasticSearch】查询优化
    【高并发解决方案】9、大流量解决方案
    【高并发解决方案】8、Nginx/LVS/HAProxy负载均衡软件的优缺点详解
    【JVM】jdk1.8-jetty-swap被占满问题排查
    【JVM】记录一次线上SWAP偏高告警的故障分析过程
    【JVM】内存和SWAP问题
    【MySQL】mysql索引结构及其原理
  • 原文地址:https://www.cnblogs.com/forever4444/p/1453544.html
Copyright © 2020-2023  润新知