A story of The Small P 题解

「2020-2021 集训队作业」A story of The Small P

题意

给定 N,m,kN, m, k ,求有多少个正整数序列 h 满足:

  • h 的长度 nn 满足 1nN1\leq n\leq N
  • 1him1\leq h_i\leq m
  • 正好存在 kkii 满足 hi<hi+1h_i<h_{i+1}

答案模 998244353998244353

2N,m,k219,(Nk+1)×m2202\leq N, m, k\leq 2^{19},(N-k+1)\times m\leq 2^{20}

思路

先想 dp 。求的可以看成有 n1kn−1−k 个位置不满足的序列个数。

因为 (Nk+1)×m220(N − k + 1)\times m\leq 2^{20},设 dpi,j,kdp_{i,j,k} 表示前 ii 个值,有 jj 个不满足,结尾为 kk

dpi,j,kdp_{i,j,k} 的值转移到 dpi+1,j,l,kldp_{i+1,j,l},k\leq ldpi+1,j+1,l,j<mdp_{i+1,j+1,l},j<m

s=j×m+ks=j\times m+k,则 dpi,sdp_{i,s} 可以转移到 dpi+1,s1,s+1s1s+mdp_{i+1,s1},s+1\leq s1\leq s+m


写成生成函数。dpi=(x+...+xm)idp_i=(x+...+x ^m)^idpi,sdp_{i,s} 即为 dpidp_ixsx^s 处的系数。

对于一个长度小于 NN 的序列,在后面补上 NnN−n 个不满足。

可以写成:

i=1N((x+...+xm)i×(xm)Ni)\sum_{i=1}^N{((x+...+x^m)^i\times (x^m)^{N-i})}

=(x+...+xmxm)×i=1N((x+...+xm)i×(xm)Ni)x+...+xm1=\frac{(x+...+x^m-x^m)\times \sum_{i=1}^N{((x+...+x^m)^i\times (x^m)^{N-i}})}{x+...+x^{m-1}}

=i=1N((x+...+xm)i+1×(xm)Ni(x+...+xm)i×(xm)Ni+1)x+...+xm1=\frac{\sum_{i=1}^N{((x+...+x^m)^{i+1}\times (x^m)^{N-i}}-(x+...+x^m)^i\times (x^m)^{N-i+1})}{x+...+x^{m-1}}

=(x+...+xm)N+1(x+...+xm)×(xm)N+1x+...+xm1=\frac{(x+...+x^m)^{N+1}-(x+...+x^m)\times (x^m)^{N+1}}{x+...+x^{m-1}}

=(x+...+xm)N+1(xm)N+1x+...+xm1(xm)N=\frac{(x+...+x^m)^{N+1}-(x^m)^{N+1}}{x+...+x^{m-1}}-(x^m)^N

=xN×(1+...+xm1)N+1(xm1)N+11+...+xm2(xm)N=x^N\times \frac{(1+...+x^{m-1})^{N+1}-(x^{m-1})^{N+1}}{1+...+x^{m-2}}-(x^m)^N

而答案即为 x(N1k)m+1...x(Nk)mx^{(N−1−k)∗m+1}...x^{(N−k)∗m} 项的系数之和。


G(x)=1+...+xm1,F(x)=G(x)N+1=(fi×xi)G(x)=1+...+x^{m-1},F(x)=G(x)^{N+1}=\sum{(f_i\times x^i)}

F(x)=(N+1)G(x)G(x)NF'(x)=(N+1)G'(x)G(x)^N

F(x)G(x)=(N+1)G(x)F(x)F'(x)G(x)=(N+1)G'(x)F(x)

F(x)=i×fi×xi1F'(x)=\sum i\times f_i\times x^{i-1}

G(x)=i=0m2(i+1)×xiG'(x)=\sum_{i=0}^{m-2}{(i+1)\times x^i}

对于 xnx^n 对比系数:

i=0m1(ni+1)×fni+1=i=0m2(i+1)×fni\sum_{i=0}^{m-1}{(n-i+1)\times f_{n-i+1}}=\sum_{i=0}^{m-2}{(i+1)\times f_{n-i}}

(n+1)fn+1=i=1m1((N+2)×in1)fni+1(n+1)f_{n+1}=\sum_{i=1}^{m-1}{((N+2)\times i-n-1)f_{n-i+1}}

fi=((n+2)×((i×j=1m1fij)j=1m1((nj+1)×fnj+1))i×j=1m1fnj+1)×invif_i=((n+2)\times ((i\times \sum_{j=1}^{m-1}{f_{i-j})}-\sum_{j=1}^{m-1}{((n-j+1)\times f_{n-j+1}}))-i\times \sum_{j=1}^{m-1}{f_{n-j+1}})\times inv_i

前缀和转移。

到这里可以算出 (1+...+xm1)N+1(xm1)N+1(1+...+x^{m-1})^{N+1}-(x^{m-1})^{N+1} 的系数。


处理除法。

g(x)=11+...+xm1=(gi×xi)g(x)=\frac{1}{1+...+x^{m-1}}=\sum (g_i\times x^i)

g0=1g_0=1

对于 xnx^n 对比系数:

i=0m1gni=0\sum_{i=0}^{m-1}{g_{n-i}}=0

gi=i=1m2gijg_i=\sum_{i=1}^{m-2}{g_{i-j}}

答案即为 F(x)×g(x)F(x)\times g(x)x(N1k)m+1N...x(Nk)mNx^{(N−1−k)∗m+1-N}...x^{(N−k)∗m-N} 项系数和。

对于每个 fif_i 计算贡献:

ans=i((j=(Nk)×m+1iN(Nk)×m+miNgj)×fi)ans=\sum_i {((\sum_{j=(N-k)\times m+1-i-N}^{(N-k)\times m+m-i-N}{g_j})\times f_i)}

end.