HDU 6470 [電源]マトリックス速いです

トピックへのリンク:http://acm.hdu.edu.cn/showproblem.php?pid=6470

この質問は、私自身は、行列式を起動する方法を迅速行列のパワーを忘れないようにすることです書きます。

コードはTLEであることに注意してください!

1の#include <stdio.hの>
 2の#include < ストリング・H>
 3  の#define MEM(A、B)のmemset(A、B、はsizeof(A))
 4のtypedef 長い LL。
5  のconst  int型のmod = 123456789 ;
6  
7  LL N。
8  
9  構造体マトリックス
 10  {
 11      LL [ 10 ] [ 10 ]。
12  } A、RES、TEMP;
13  
14  マトリックス乗算(行列Bの行列)
 15  {
 16の     マトリックスANS。
17     MEM(ans.a、0 );
18      のためにint型 i = 1 ; iが= < 6 ; I ++ 19          のためのINT J = 1 ; J <= 6 ; J ++ 20              のためのINT K = 1 ; <= K 6あり、k ++ 21              {
 22                  ans.a [I] [J] + = AA [I] [K] * BA [K] [J]%MOD。
23                  ans.a [I] [J]%= MOD。
24              }
 25の     リターンANS。
26 }
27 
28 int main()
29 {
30     mem(A.a, 0);  //构造矩阵 
31     A.a[1][2] = A.a[2][2] = A.a[2][3] = A.a[3][3] = A.a[3][6] = A.a[4][4] = A.a[4][6] = A.a[5][5] = A.a[5][6] = A.a[6] [ 6 ] = 1 32      Aaの[ 2 ] [ 1 ] = Aaが[ 4 ] [ 5 ] = 2 33      Aaの[ 3 ] [ 4 ] = Aaが[ 3 ] [ 5 ] = 3 ;
34      INT T。
35      のscanf(" %dの"、&T)。
36      一方、(T - 37      {
 38          TEMP = A。  // 初始化一時矩阵
39          MEM(res.a、0); // 単位行列に初期化
40          のためのINT I = 1 ; I <= 6。 ; I ++ 41が              = res.a [I] [I] 1。;
 42である          (scanfの" %のLLD "、およびN-) ;
 43は          = N - 2 ;
 44は         、一方(N-)
 45          {
 46は             IF(%N- 2 47の                  RES = 乗算(RES、TEMP);
 48              TEMP = 乗算(TEMP、TEMP);
 49             N / A = 2 50          }
 51          のprintf(" %LLDする\ n "、(1 * res.a [ 2 ] [ 1 ]%のMOD + 2 * res.a [ 2 ] [ 2 ]%のMOD + 27 * res.a [ 2 ] [ 3 ]%+ MOD 9 * res.a [ 2 ] [ 4 ]%+ MOD 3 * res.a [ 2 ] [ 5 ]%MOD +のres.a [ 2 ] [ 6 ]%MOD)%のMOD)。
52      }
 53     リターン 0 ;
54 }
コードの表示

 

 

 

おすすめ

転載: www.cnblogs.com/yuanweidao/p/11729865.html