アイデア:パワーマトリックス速い+マップ
コード:
#include <cmath> の#include <アルゴリズム> の#include <cstdioを> する#include <地図> のconst int型 INF = 0x3f3f3f3f 。 const int型 MAXN = 1E7 + 10 。 const int型のmod = 998244353 ; 使用して 名前空間はstdを、 typedefの長い 長いLL。 マップ <-1,11,11-> 融点; LLのn; 構造体マット { LLのM [ 4 ] [ 4 ]。 }単位; マット演算子 *(のconstマットと、CONSTマット&B) { マットQ。 QM [ 1 ] [ 1 ] =(AM [ 1 ] [ 1 ] * BM [ 1 ] [ 1 ] +午前[ 1 ] [ 2 ] * BM [ 2 ] [ 1 ])%MOD。 QM [ 1 ] [ 2 ] =(AM [ 1 ] [ 1 ] * BM [ 1 ] [ 2 ] +午前[ 1 ] [ 2 ] * BM [ 2 ] [ 2 ])%MOD。 QMの[ 2] [ 1 ] =(AM [ 2 ] [ 1 ] * BM [ 1 ] [ 1 ] +午前[ 2 ] [ 2 ] * BM [ 2 ] [ 1 ])%MOD。 QM [ 2 ] [ 2 ] =(AM [ 2 ] [ 1 ] * BM [ 1 ] [ 2 ] +午前[ 2 ] [ 2 ] * BM [ 2 ] [ 2 ])%MOD。 戻るQを。 } マットF、ANS。 LLのpow_mat(MAT、LL N) { 場合(mp.count(n))をリターンMP [n]は、 LLのTEMP = N。 一方、(N) { 場合(N - 1 ) { N - 。 F = F * ; } N >> = 1 。 A * = 。 } 戻り MP [TEMP] = FM [ 1 ] [ 1 ]%のMOD。 } LL KK [MAXN]。 INT メイン() { LL Q、N。 scanf関数(" %のLLDの%のLLD "、&Q& N)。 LL TMP= N; 以下のために(int型 i = 0 ; iはQを<; iは++ ) { FM [ 1 ] [ 1 ] = 1 。 FM [ 1 ] [ 2 ] = 0 。 ans.m [ 1 ] [ 1 ] = 3 ; ans.m [ 1 ] [ 2 ] = 1 。 ans.m [ 2 ] [ 1 ] = 2 ; ans.m [ 2 ] [ 2 ] = 0; LL NN = pow_mat(ANS、tmp- 1 )。 KK [I] = NN%のMOD。 TMP ^ =(NN * NN)。 } AA LL =のKK [ 0 ]。 用(int型 i = 1 ; iがQを<Iは++ ) { AA ^ = KKの[iが]。 } のprintf(" %LLDする\ n "、AA%のMOD)。 リターン 0 ; }