トピックへのリンク: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 }