zoukankan      html  css  js  c++  java
  • 【单位矩阵】【杭电OJ1575】

    Tr A

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

    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
    题目分析:这不同于上一篇博客那道题目,这个是要求一个矩阵本身的若干次幂,而上一篇是两个矩阵相乘,
          这道题需要引入一个单位矩阵【它的作用和实数里面的1一样,是一个在i==j也就是对角线上为1,其余位置为0的矩阵】
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 using namespace std;
     6 long long n,k;
     7 void mul(long long wqw[10][10],long long tat[10][10])
     8 {
     9     long long or2[10][10];
    10     memset(or2,0,sizeof(or2));
    11     for(int i = 0 ; i < n  ; i++)
    12     {
    13         for(int j = 0 ; j < n ; j++)
    14         {
    15             for(int kk = 0 ; kk < n ;kk++)
    16             {
    17                 or2[i][j]+=(wqw[i][kk]*(tat[kk][j]))%9973;
    18                 or2[i][j]%=9973;
    19             }
    20         }
    21     }
    22     memcpy(wqw,or2,sizeof(or2));
    23 }
    24 void mulself(long long awa[10][10])
    25 {
    26     long long or3[10][10];
    27     memset(or3,0,sizeof(or3));
    28     for(int i = 0; i < n ; i++)
    29     {
    30         for(int j = 0 ; j< n ; j++)
    31         {
    32             for(int kk = 0 ; kk < n ; kk++)
    33             {
    34                 or3[i][j]+=((awa[i][kk])%9973)*((awa[kk][j])%9973)%9973;
    35                 or3[i][j]%=9973;
    36             }
    37         }
    38     }
    39     memcpy(awa,or3,sizeof(or3));
    40 }
    41 int main()
    42 {
    43     int T;
    44     scanf("%d",&T);
    45     while(T--)
    46     {
    47         long long qwq[10][10],qaq[10][10];
    48         scanf("%lld%lld",&n,&k);
    49         memset(qwq,0,sizeof(qwq));
    50         for(int i = 0 ; i < n ; i++)
    51         {
    52             for(int j = 0 ; j < n ; j++)
    53             {
    54                 scanf("%lld",&qaq[i][j]);
    55                 if(i==j)
    56                 qwq[i][j]=1;//1单位矩阵 
    57             }
    58         }
    59 
    60     while(k)
    61     {
    62         if(k&1)
    63         mul(qwq,qaq);
    64         mulself(qaq);
    65         k/=2;
    66     }
    67     long long sum=0;
    68     for(int i = 0 ; i < n ; i++)
    69     {
    70         sum+=(qwq[i][i]%9973);
    71         sum%=9973;
    72     }
    73     cout << sum %9973 << endl;
    74 }
    75     return 0;
    76 }

     

  • 相关阅读:
    Ubuntu操作系统如何设置默认启动内核
    设置和取消环境变量
    vue create与vue init的区别
    base64 编解码
    获取url中的参数
    ubuntu账户密码正确但是登录不了怎么办
    斐波那契数列的递推式-----动态规划
    Round-Robin轮询调度法及其实现原理
    MySql中float类型的字段的查询
    使用 Python 从网页中提取主要文本内容
  • 原文地址:https://www.cnblogs.com/MekakuCityActor/p/9008380.html
Copyright © 2011-2022 走看看