https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43035417
I-段階の選択があると仮定して移動しない、ステップ移動niがあります
右へ選択ステップが存在であるという仮定は、ステップがNIAを残し
所以-m <= A-(NIA)<= M
所以(NMI)/ 2 <= A <=分{NI、(N + MI)/ 2}
令G(I)=ΣC(NI)(3 ^ A)(2 ^(NIA))
答え=ΣC(N、I)G [i]は
再帰はどのようにG [i]を考慮して決定しました
令F(N、M)= C(n、m)は(3 ^ M)(2 ^(NM))
则3F(N-1、M-1)+ 2F(N-1、M)= F(n、m)は
N = 8、M = 3と仮定
G [0] = F(8,3)+ F(8,4)+ F(8,5)
= 3F(7,2)+ 5F(7,3)+ 5F(7,4)+ 2F(7,5)
G [1] = F(7,2)+ F(7,3)+ F(7,4)+ F(7,5)
= 3F(6,1)+ 5F(6,2)+ 5F(6,3)+ 5F(6,4)+ 2F(6,5)
G [2] = F(6,2)+ F(6,3)+ F(6,4)
= 3F(5,1)+ 5F(5,2)+ 5F(5,3)+ 2F(5,4)
G [3] = F(5,1)+ F(5,2)+ F(5,3)+ F(5,4)
頭尾ことができ、その後、G [i]が5を乗じた、既知のG [i]の場合、発見され、その後実際に係合することができます
)の#include <cstdioを> する#include <アルゴリズム> 使用して名前空間はstdを、#define N 3000001 のconst int型 MOD = 998244353 。 typedefの長い長いLL。INT G [N]。 INT POW2 [N]、pow3 [N]、FAC [N]、INV [N]。INT C(INT nは、INT M) { 戻り 1LL * FAC [N] * INV [M]%のMOD * INV [nm]の%MOD。 } int型 F(整数 nは、INT M) { 戻り 1LL * C(n、m)は* pow3 [M]%のMOD * POW2 [nm]の%のMOD。 } INT POW(整数 nは、INTのM) { int型 S = 1 。 用(; M; M >> = 1、N = 1LL * N * N%のMOD) 場合(M 1)S = 1LL * S * N%のMOD。 リターン秒; } int型のmain() { int型N、M。 scanf関数(" %D%D "、&N、&M)。 POW2 [ 0 ] = 1 ; pow3 [ 0 ] = 1 ; FAC [ 0 ] = 1 ; INV [0 ] = 1 ; 以下のために(INT iが= 1 ; I <N; ++ I) { POW2 [I] = POW2 [I- 1 ] * 2%のMOD。 pow3 [I] = 1LL * pow3 [I- 1 ] * 3%のMOD。 FAC [i]は = 1LL * FAC [I- 1 ] * I%MOD。 INV [I] = POW(FAC [i]は、mod- 2 )。 } int型の L = 0、R = 0、NL、NR、ANS = 1 。 用(INT I = N; I> =0 ; - I) { NL = MAX(0、NM-I + 1 >> 1 )。 NR =分(NI、M + NI >> 1 )。 もし(NL> L)ANS =(ANS-F(NI、L ++)+ MOD)%のMOD。 一方、(NR> R)ANS =(ANS + F(NI、++ R))%のMOD。 G [I] = ANS。 ANS = 5LL * ANS%のmod。 もし(NL> = 1)ANS =(ANS + 3LL * F(NI、NL- 1)%MOD)%のMOD。 ANS =(ANS-3LL * F(NI、NR)%MOD + MOD)%のMOD。 } ANS = 0 ; 以下のために(INT iが= 0 ; I <= N; ++ I)ANS =(ANS + 1LL * C(N、I)* G [I]%のMOD)%のMOD。 printf(" %dの" 、ANS)。 リターン 0 ; }