zoukankan      html  css  js  c++  java
  • C语言编程练习34:Tr A

    题目描述

    A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。

    输入

    数据的第一行是一个T,表示有T组数据。每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。

    输出

    对应每组数据,输出Tr(A^k)%9973。

    样例输入 Copy

    3
    1 42
    7 
    2 6335
    0 9 
    4 8 
    3 29359
    2 4 5 
    5 1 7 
    1 1 5 
    

    样例输出 Copy

    3969
    5510
    5473
    

    机构平台标程
    #include <stdio.h>
     #include <stdlib.h>
     #include <string.h>
     typedef struct Node
     {
         int m[11][11];
     }Matrix;
     Matrix init, unit;  //初始化输入矩阵,单位矩阵如果用递归写Pow函数可以不用单位矩阵
     int n, K;
     void Init( )  //初始化
     {
         scanf( "%d%d", &n, &K );
         for( int i=0; i<n; ++ i )
             for( int j=0; j<n; ++ j )
             {
                 scanf( "%d", &init.m[i][j] );
                 unit.m[i][j]=( i == j );
             }
     }
      
     Matrix Mul( Matrix a, Matrix b )  //矩阵乘法
     {
         Matrix c;
         for( int i=0; i<n; ++ i )
         {
             for( int j=0; j<n; ++ j )
             {
                 c.m[i][j]=0;  //特别注意
                 for( int k=0; k<n; ++ k )
                 {
                     c.m[i][j] += a.m[i][k]*b.m[k][j];
                 }
                 c.m[i][j] %= 9973;
             } 
         }
         return c;
     }
      
     Matrix Pow( Matrix a, Matrix b, int k )
     {
         while( k>1 )
         {
             if( k&1 )  // k为奇数时
             {
                 k --;
                 b=Mul( a, b );
             }
             else   // k为偶数
             {
                 k >>= 1;
                 a=Mul( a, a );
             }
         }
         a=Mul( a, b );
         return a;
     }
      
     int main( )
     {
         int T;
         scanf( "%d", &T );
         while( T -- )
         {
             Matrix x;
             Init( );
             x=Pow( init, unit, K );
             int sum=0, i=0;
             n--;
             while( n >= 0 )
             {
                 sum += x.m[n][n];
                 sum%=9973;
                 n --;    
             }
             printf( "%d
    ", sum%9973 );
         }
     }
    
  • 相关阅读:
    (转)CKEditor+CKFinder 配置
    asp.net一个带抽象工厂的三层架构完整实例
    windows phone 8 手机存储卡数据
    c#常用算法
    mvvm 事件命令
    windows phone 8 语音识别1
    windows phone 8 分辨率
    PHP通用防注入安全代码《转》
    SQL查询语句使用详解《转》
    PHP中文件包含语句的区别《转》
  • 原文地址:https://www.cnblogs.com/FantasticDoubleFish/p/14335670.html
Copyright © 2011-2022 走看看