「2020-2021 集训队作业」A story of The Small P
题意
给定 N,m,k ,求有多少个正整数序列 h 满足:
- h 的长度 n 满足 1≤n≤N。
- 1≤hi≤m。
- 正好存在 k 个 i 满足 hi<hi+1。
答案模 998244353。
2≤N,m,k≤219,(N−k+1)×m≤220。
思路
先想 dp 。求的可以看成有 n−1−k 个位置不满足的序列个数。
因为 (N−k+1)×m≤220,设 dpi,j,k 表示前 i 个值,有 j 个不满足,结尾为 k。
dpi,j,k 的值转移到 dpi+1,j,l,k≤l 和 dpi+1,j+1,l,j<m。
令 s=j×m+k,则 dpi,s 可以转移到 dpi+1,s1,s+1≤s1≤s+m。
写成生成函数。dpi=(x+...+xm)i。dpi,s 即为 dpi 在 xs 处的系数。
对于一个长度小于 N 的序列,在后面补上 N−n 个不满足。
可以写成:
i=1∑N((x+...+xm)i×(xm)N−i)
=x+...+xm−1(x+...+xm−xm)×∑i=1N((x+...+xm)i×(xm)N−i)
=x+...+xm−1∑i=1N((x+...+xm)i+1×(xm)N−i−(x+...+xm)i×(xm)N−i+1)
=x+...+xm−1(x+...+xm)N+1−(x+...+xm)×(xm)N+1
=x+...+xm−1(x+...+xm)N+1−(xm)N+1−(xm)N
=xN×1+...+xm−2(1+...+xm−1)N+1−(xm−1)N+1−(xm)N
而答案即为 x(N−1−k)∗m+1...x(N−k)∗m 项的系数之和。
设 G(x)=1+...+xm−1,F(x)=G(x)N+1=∑(fi×xi)。
F′(x)=(N+1)G′(x)G(x)N
F′(x)G(x)=(N+1)G′(x)F(x)
F′(x)=∑i×fi×xi−1
G′(x)=i=0∑m−2(i+1)×xi
对于 xn 对比系数:
i=0∑m−1(n−i+1)×fn−i+1=i=0∑m−2(i+1)×fn−i
(n+1)fn+1=i=1∑m−1((N+2)×i−n−1)fn−i+1
fi=((n+2)×((i×j=1∑m−1fi−j)−j=1∑m−1((n−j+1)×fn−j+1))−i×j=1∑m−1fn−j+1)×invi
前缀和转移。
到这里可以算出 (1+...+xm−1)N+1−(xm−1)N+1 的系数。
处理除法。
设 g(x)=1+...+xm−11=∑(gi×xi)。
g0=1
对于 xn 对比系数:
i=0∑m−1gn−i=0
gi=i=1∑m−2gi−j
答案即为 F(x)×g(x) 的 x(N−1−k)∗m+1−N...x(N−k)∗m−N 项系数和。
对于每个 fi 计算贡献:
ans=i∑((j=(N−k)×m+1−i−N∑(N−k)×m+m−i−Ngj)×fi)
end.