• 8.3.1 Tr A


    最惊心动魄的矩阵一章~~~

    Tr A

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

    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 #include <cstdio>
     2 #include <cstdlib>
     3 #include <iostream>
     4 #include <cstring>
     5 #include <string>
     6 #include <algorithm>
     7 using namespace std;
     8 
     9 const int maxn=13;
    10 const int mod=9973;
    11 struct matrix
    12 {
    13     int m[maxn][maxn];
    14 };
    15 matrix a,b,base,ans,c;
    16 int n,k,sum,T;
    17 
    18 void close()
    19 {
    20     exit(0);
    21 }
    22 
    23 matrix mul(matrix a,matrix b)
    24 {
    25     memset(c.m,0,sizeof(c.m));
    26     for (int i=1;i<=n;i++)
    27         for (int j=1;j<=n;j++)
    28             for (int k=1;k<=n;k++)
    29             {
    30                 c.m[i][j]+=a.m[i][k]*b.m[k][j];
    31                 c.m[i][j] %= mod;
    32             }
    33     return c;
    34 }
    35 
    36 void print(matrix a)
    37 {
    38     for (int i=1;i<=n;i++)
    39     {
    40         for (int j=1;j<=n;j++)
    41             printf("%d ",a.m[i][j]);
    42         printf("
    ");
    43     }
    44 }
    45 
    46 void work()
    47 {
    48     //ans -> 答案 base->乘方
    49     base=a;
    50     for (int i=1;i<=n;i++)
    51         for (int j=1;j<=n;j++)
    52             if (i==j)
    53                 ans.m[i][i]=1;
    54             else
    55                 ans.m[i][j]=0;
    56     while (k!=0)
    57     {
    58         if (k & 1)
    59         {
    60             ans=mul(base,ans);
    61         }
    62         k/=2;
    63         base=mul(base,base);
    64     }
    65 }
    66 
    67 void init()
    68 {
    69     while (scanf("%d",&T)!=EOF)
    70     {
    71         while (T--)
    72         {
    73             while (scanf("%d %d",&n,&k)!=EOF)
    74             {
    75                 for (int i=1;i<=n;i++)
    76                     for (int j=1;j<=n;j++)
    77                         scanf("%d",&a.m[i][j]);
    78                 work();
    79                 sum=0;
    80                 for (int i=1;i<=n;i++)
    81                     sum=(sum+ans.m[i][i]) % mod;
    82                 printf("%d
    ",sum);
    83             }
    84         }
    85     }
    86 }
    87 
    88 int main ()
    89 {
    90     init();
    91     close();
    92     return 0;
    93 }
  • 相关阅读:
    2011Android技术面试整理附有详细答案(包括百度、新浪、中科软等多家公司笔试面试题)
    SQL注入攻击与防御
    从零开始学习jQuery
    linux内核定时器
    国内外 Java Script 经典封装
    jQuery EasyUI API 中文文档
    新手该怎么学习DIV+CSS网页标准布局?
    3种方法修改PHP时区
    linq教程
    BizTalk Server 系列文章目录
  • 原文地址:https://www.cnblogs.com/cssystem/p/3335201.html
Copyright © 2020-2023  润新知