URL:https://nanti.jisuanke.com/t/41355
質問の意味:
mod998244353 $ XORすべての値の倍の$ Q $ $ F(n)を求め、$ F(N)$を再帰式で与えられ、そしてオンラインである必要があり、$ Q \当量の1E7の$。
ソリューション:
形式$ F(N)* F(N-1)+ B * F(N-2)= $方程式を参照してください、行列が速い指数ルーチンで、直接の行列は、すぐに電源を求めて、その後、意図したタイトルに従ってくださいシミュレーションが可能。パワーと迅速な高速電力同様の行列が、$ resをする= 1 $行列の先頭を交換することができます。$の1E7の$タイムアウトを測定し、パスのメモリに追加します。
ACコード:
#include <ビット/ STDC ++ H> の#pragma GCCの最適化(3) 名前空間stdを使用。 typedefの長い長いLL。 const int型のmod = 998244353; const int型MAXN = 1E7 + 5。 unordered_map <int型、LL>融点; 構造体マット { LLのM [2] [2]。 }。 マットのMUL(マットbをMAT) { マットTMP。 memset(tmp.m、0、はsizeof(tmp.m))。 tmp.m [0] [0] =(AM [0] [0] * BM [0] [0]%MOD +アム[0] [1] * BM [1] [0]%のMOD)%MOD。 tmp.m [0] [1] =(AM [0] [0] * BM [0] [1]%MOD +アム[0] [1] * BM [1] [1]%のMOD)%MOD。 tmp.m [1] [0] =(AM [1] [0] * BM [0] [0]%MOD +午前[1] [1] * BM [1] [0]%のMOD)%MOD。 { マットRES。 tmp.m [1] [1] =(AM [1] [0] * BM [0] [1]%MOD +午前[1] [1] * BM [1] [1]%のMOD)%MOD。 TMPを返します。 } マットINV(LL N、MAT) のmemset(res.m、0、はsizeof(res.m))。 以下のために(; iは2 <; I = 0 int型++ I) res.m [i]は[I] = 1。 一方、(n)は { (N&1)であれば 、RES = MUL(RES、A)。 = MUL(A)。 N >> = 1。 } RESを返します。 } マットBEG、B、mtmp。 ボイドのinit() { memsetの(beg.m、0、はsizeof(beg.m))。 beg.m [0] [0] = 1。 BM [0] [0] = 3; BM [0] [1] = 1。 BM [1] [0] 2 =。 } int型のmain() { LLのQ、N、ANS = 0。 その中に(); scanf関数( "%のLLDの%のLLD"、&Q、&N)。 (; I <= Q ++ iは1 = INT)のために { TMP LL; (もし!mp.count(N)) { mtmp = MUL(BEG、INV(B、N - 1))。 TMP = mtmp.m [0] [0]%のMOD。 融点[N] = TMP。 } 他 TMP = MP [N]; ANS ^ = TMP; TMPの%= MOD。 N ^ = TMP * tmpに。 } のprintf( "%LLDする\ n"、ANS)。 0を返します。 }