もちろん、私たちは、電源の最初の瞬間を取ることができ、その後すぐに$ T $を飛びます
なぜなら、マトリックスは、したがって、オイラーが行列の数に下降することができ、問題の特殊な性質の見つかった問題の解決策を見てください
しかし、私は証明し理解していないので、私は暴力ファックを練習することにしました
その後、十進すぐに電源、および後方、定数だけでなく、行列乗算の順序を注意しません
#include <iostreamの> する#include <cstdioを> する#include <アルゴリズム> の#include <CStringの> する#include <cmath> 使用して 名前空間STD。 typedefの長い 長いLL。 インラインint型リード() { int型のx = 0、F = 1。チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1。CH =getchar関数(); } 一方、(CH> = ' 0 ' && CH <= ' 9 '){X =(X << 1)+(X << 3)+(CH ^ 48)。CH = GETCHAR()。} 戻りのx *のF。 } のconst int型 N = 1E6 + 7、MO = 1E9 + 7 。 チャーN [N]、M [N]。 構造体マトリックス{ INT [ 3 ] [ 3 ]。 行列(){memsetの(0、はsizeof (a)参照)。} インライン行列演算子(*CONST行列とTMP)のconst { マトリックスRES。 res.a [ 1 ] [ 1 ] =(1LL * [ 1 ] [ 1 ] * tmp.a [ 1 ] [ 1 ] + 1LL * [ 1 ] [ 2 ] * tmp.a [ 2 ] [ 1 ] )%のMO; res.a [ 1 ] [ 2 ] =(1LL * [ 1 ] [ 1 ] * tmp.a [ 1 ] [ 2 ] + 1LL * [ 1 ] [ 2 ] * tmp.a [ 2 ] [ 2 ] )%のMO; res.a [2 ] [ 1 ] =(1LL * A [ 2 ] [ 1 ] * tmp.aの[ 1 ] [ 1 ] + 1LL * A [ 2 ] [ 2 ] tmp.a * [ 2 ] [ 1 ])%のMo。 res.a [ 2 ] [ 2 ] =(1LL * A [ 2 ] [ 1 ] * tmp.aの[ 1 ] [ 2 ] * 1LL + A [ 2 ] [ 2 ] * tmp.a [ 2 ] [ 2 ] )%のMo; // 定数ループアンローリングの最適化 リターンRESを; } } F.、G、アンス; マトリックスKSM(マトリックスX、チャー *のY)// 十进制快速幂 { マトリックスRES、T。res.a [ 1 ] [ 1 ] = res.a [ 2 ] [ 2 ] = 1 。 以下のために(int型 I =のSTRLEN(Y + 1); iが; i-- ) { T = X。 もし(Y [I] == ' 9 '){T = Tの* tの、T = Tの*トン。T = Tの*トン。T = Tの*のX; RESの=の解像度* トン。} そう であれば(Y [I] == ' 8 '){T = Tの* tの、T = Tの*トン。T = Tの*トン。RESの=の解像度* トン。} 他 のための(int型J = 1 ; J <= Y [I] - ' 0 ' ; J ++)RES = RES * X。 t = xと; X = X * X; X = X * X; X = X * X; X = X * T; X = X * T; } 戻りRESと、 } ボイドマイナス(チャー *秒)// 把数减一 { ため(int型 I =のSTRLEN(S + 1 ; I i--) ) であれば(S [I] == ' 0 ')S [I] = ' 9 " ; 他 {S [I] = sの[I] - 1。破ります; } } int型メイン() { int型、B、C、D。scanf関数(" %sの"、N + 1)。scanf関数(" %sの"、M + 1 )。= read()は、B =読み取る()、C =読み取る()、D = 読み取ります(); Ans.a [ 1 ] [ 1 ] = Ans.a [ 1 ] [ 2 ] = 1 。 FA [ 1 ] [ 1 ] =。FA [ 2 ] [ 1 ] = B; FA [ 2 ] [ 2 ] = 1 。 GA [ 1 ] [ 1 ] = C。ジョージア[ 2] [ 1 ] Dを=。GA [ 2 ] [ 2 ] = 1 。 マイナス(N)マイナス(M)。 F = KSM(F、M); G = F * G。G = KSM(G、N)。 ANS = ANS * G * F。 printf(" %Dを\ n "、Ans.a [ 1 ] [ 1 ])。 リターン 0 ; }