程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [矩陣乘法實踐]HDU 1575——Tr A

[矩陣乘法實踐]HDU 1575——Tr A

編輯:C++入門知識

要求求解Tr(a^k)%9937,注意不要到最後才余,在每處理完一次的時候就余一下(矩陣性質:矩陣中的每個數同時除以/乘以相同整數,矩陣的性質均不變(包括矩陣的跡、矩陣的秩、矩陣的最簡階梯行列式等等)否則數字過大會溢出。 [cpp]   #include <iostream>   #include <cmath>   #include <cstring>   using namespace std;      class Mat   {   public:       int mat[15][15];   };      int n;     //維度,即矩陣A的行數   int MOD=9973;//好多問題要求給出取余之後的數字   Mat E;      void initE()   {       for(int i=0;i<15;i++)           E.mat[i][i]=1;   }      Mat operator*(Mat a,Mat b)   {       int i,j,k;       Mat c;       for (i=0;i<n;i++)       {           for (j=0;j<n;j++)           {               c.mat[i][j] = 0;               for (k=0;k<n;k++)               {                       c.mat[i][j]+=(a.mat[i][k]*b.mat[k][j]);               }               c.mat[i][j]%=MOD;           }       }       return c;   }      Mat operator+(Mat a,Mat b)   {       Mat c;       int i,j;       for (i=0;i<n;i++)       {           for (j=0;j<n;j++)               c.mat[i][j] = a.mat[i][j]+b.mat[i][j];           c.mat[i][j]%=9973;       }       return c;   }      Mat operator^(Mat a,int x)     {          Mat p = E,q = a;          while (x>=1)          {              if(x%2==1)                  p = p*q;              x/=2;              q = q*q;          }          return p;     }      Mat solve(Mat a,int p)     {          if(p==1)              return a;        else if(p&1)              return (a^p)+solve(a,p-1);          else              return ((a^(p>>1))+E)*solve(a,p>>1);     }           int main()   {       int testcase;       cin>>testcase;       Mat at,bt;       int res;       int kp;       while(testcase--)       {              res=0;           initE();           memset(at.mat,0,sizeof(at.mat));           memset(bt.mat,0,sizeof(bt.mat));           cin>>n>>kp;           for(int i=0;i<n;i++)           {  www.2cto.com             for(int j=0;j<n;j++)               {                   cin>>at.mat[i][j];               }           }                      bt=at^kp;                      for(int i=0;i<n;i++)           {               res+=bt.mat[i][i];           }           cout<<res%9973<<endl;       }       return 0;   }  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved