ブログに書くのが面倒紙の上で完全な分析、
私はこんにゃくです、唯一のソースコード
書式#include <iostreamの> 書式#include <stdio.hに> する#include < 文字列の.h> 使用して 名前空間はstdを、 typedefの長い 長いLL。 const int型 MAXN = 107 ; LLモッズ; 構造体マット{ LLのM [MAXN] [MAXN]。 INT X、Y。/// X是行数Y是列数 }手段と ボイドinit_unit(){ memsetの(unit.m、0、はsizeof (unit.m))。 用(int型 iは= 0 ; iがMAXNを<Iは++ ) unit.m [i]は[I] =1 ; } ボイドショー(マットA){ ため(int型 i = 1 ; iが= AXを<; Iは++ ){ ため(INT J = 1 ; J <= AY; J ++ ) のprintf(" %dの" 、午前[I] [J ]); printf(" \ nを" ); } } マットmat_mul(マットA、マットB){ マットC。 CX = AX、CY = によって、 memset(CM、0、はsizeof (CM))。 以下のための(int型 I = 1; I <= CX; I ++ ) のための(INT J = 1 ; J <= CY; J ++ ){ ための(int型のk = 1 ; K <= AY; K ++ ){ CM [I] [J] + =(AM [ I] [K] * BM [K] [J])%(mod- 1 )。 CM [I] [J]%= mod- 1 。 } } 戻りC。 } マットmat_QuickPow(LL bをMAT){ マットANS = 手段と ans.x =斧、ans.y = AY。 一方、(b)は、{ もし、(B&1 ) ANS = mat_mul(ANS、A)。= mat_mul(A)。 B >> = 1 。 } 戻りANS。 } LL QuickPow(LL、LL b)は{ LL ANS = 1 。 一方、(B){ 場合(B&1(A ANS *)%)ANS = MOD。=(* A)%MOD。 B >> = 1 。 } 戻りANS。 } int型Tと、 LL N、X、Y、Z。 INT メイン(){ scanf関数(" %dの "、&T); init_unit(); 一方、(t-- ){ scanf関数(" %I64d%I64d%I64d%I64d%I64d "、&N、およびX&Y、およびZ、&MOD)。 マット; AX = AY = 3 。 AM [ 1 ] [ 1 ] = 1、午前[ 1 ] [ 2 ] = Y、午前[ 1 ] [ 3 ] = 0 ; AM [ 2 ] [ 1 ] = 0、午前[ 2 ] [ 2 ] = Z、午前[ 2 ] [ 3 ] =1 ; AM [ 3 ] [ 1 ] = 0、午前[ 3 ] [ 2 ] = 1、午前[ 3 ] [ 3 ] = 0 ; もし(N == 1 ){ のprintf(" 1 \ n " ); 続け; } であれば(N == 2 ){ のprintf(" %I64dの\ n " 、QuickPow(X、Y))。 続け; } A = mat_QuickPow(N-2); LLさt =(AM [ 1 ] [ 2 ] +午前[ 2 ] [ 2 ] * Y)。 printf(" %I64dの\ n " 、QuickPow(X、T))。 } 戻り 0 。 }