• hdu 1575 Tr A


    Tr A

    http://acm.hdu.edu.cn/showproblem.php?pid=1575

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


    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
    矩阵快速幂,可以类似于常数快速幂
    把一个矩阵看成一个常数
    __int64 fast(__int64 a,__int64 b,__int64 c)
    {
        __int64 r=a%c,sum=1;//sum=1,在矩阵里就为单位矩阵(即主对角线全为1 其他地方为0)
        if(b==0)
            return 1%c;
        while(b>1)
        {
            if((b&1)!=0)
              sum=((sum%c)*r)%c;
            r=(r*r)%c;
            b/=2;
        }
        return (sum*r)%c;
    }
    matrix fast(matrix a,int n,matrix b)
    {
        mod(a);
        while(n>=1)
        {
            if((n&1)!=0)
            {
                b=add(a,b);
                mod(b);
            }
            a=add(a,a);
            mod(a);
            n/=2;
        }
        return b;
    }
    #include<iostream>
    #include<string.h>
    #include<stdio.h>
    using namespace std;
    __int64 t,n,k,i,j;
    struct matrix
    {
        __int64 arr[15][15];
    } p1,p2,p3;
    matrix add(matrix a,matrix b)//矩阵乘法
    {
        matrix tmp;
        memset(tmp.arr,0,sizeof(tmp.arr));
        for(i=0; i<n; i++)
            for(j=0; j<n; j++)
            {
                for(int k=0; k<n; k++)
                    tmp.arr[i][j]+=a.arr[i][k]*b.arr[k][j];
                tmp.arr[i][j]%=9973;
            }
        return tmp;
    }
    void mod(matrix &a)//取模
    {
        for(i=0; i<n; i++)
            for(j=0; j<n; j++)
                a.arr[i][j]%=9973;
    }
    matrix fast(matrix a,int n,matrix b)//矩阵快速幂
    {
        mod(a);
        while(n>=1)
        {
            if((n&1)!=0)
            {
                b=add(a,b);
                mod(b);
            }
            a=add(a,a);
            mod(a);
            n/=2;
        }
        return b;
    }
    int main()
    {
        cin>>t;
        while(t--)
        {
            cin>>n>>k;
            for(i=0; i<n; i++)
                for(j=0; j<n; j++)
                    cin>>p1.arr[i][j];
            memset(p2.arr,0,sizeof(p2.arr));
            for(i=0; i<n; i++)       //初始化为单位矩阵!!开始就在这弄错了
                    p2.arr[i][i]=1;
            p3=fast(p1,k,p2);
            int sum=0;
            for(i=0; i<n; i++)
            {
                sum+=p3.arr[i][i];
                sum%=9973;
            }
            cout<<sum<<endl;
        }
    }
    View Code
    
    
    
    
    
  • 相关阅读:
    flutter开发dart基本数据类型与java、kotlin、oc、swift对照表
    flutter输入框TextField设置高度以及背景色等样式的正确姿势
    flutter开发tab页面嵌套滚动的最简洁实现方式
    flutter开发自定义ExpandListView分组列表组件
    RedisUtil-redisTemplate-setNX
    数据库无限层级分类设计
    魔方
    CountDownLatch在SpringBoot中配合@Async使用
    会话刷新Token校验流程
    Mybatis 夺命十八问,顶不住了!
  • 原文地址:https://www.cnblogs.com/ainixu1314/p/3231858.html
Copyright © 2020-2023  润新知