称序列 ⟨a1,⋯,an⟩\langle a_1,\cdots,a_n\rangle⟨a1,⋯,an⟩ 是避免 120 的,当且仅当不存在 1≤k<j<i≤n1\leq k<j<i\leq n1≤k<j<i≤n,满足 ai<ak<aja_i<a_k<a_jai<ak<aj。
假设 a1,⋯,ai−1a_1,\cdots,a_{i-1}a1,⋯,ai−1 已经确定了,现在要确定 aia_iai。那么为使 aaa 避免 120,只需满足 ai≥maxk<j<i,ak<ajaka_i\geq \max\limits_{k<j<i,a_k<a_j}a_kai≥k<j<i,ak<ajmaxak 即可,将满足 k<j∧ak<ajk<j\land a_k<a_jk<j∧ak<aj 的记作 (k,j)(k,j)(k,j) 组合。
设 hn,Xh_{n,X}hn,X 表示长度为 nnn 的非负整数序列 ⟨a1,⋯,an⟩\langle a_1,\cdots,a_n\rangle⟨a1,⋯,an⟩ 的个数,满足:
- a1≥1a_1\geq 1a1≥1。
- aaa 是避免 120 的。
- 设 AiA_iAi 表示满足 1≤j≤i1\leq j\leq i1≤j≤i 且 aj−1<aja_{j-1}<a_{j}aj−1<aj 的 jjj 的个数(将 a0a_0a0 看作一个负数),那么 ai≤X+Ai−1+1a_i\leq X+A_{i-1}+1ai≤X+Ai−1+1。
那么原题目的答案等于 ∑i=mNhN−m,0\sum\limits_{i=m}^N h_{N-m,0}i=m∑NhN−m,0,其中 mmm 枚举的是从 a1a_1a1 开始的极长的一段连续的 000:a1,⋯,ama_1,\cdots,a_ma1,⋯,am。
考虑怎么求 hn,Xh_{n,X}hn,X。先枚举 a1∈[1,X+1]a_1\in [1,X+1]a1∈[1,X+1],再枚举从 a1a_1a1 开始的极长的一段小于等于 a1a_1a1 的数:a1,⋯,ama_1,\cdots,a_ma1,⋯,am。
注意到 (1,m+1)(1,m+1)(1,m+1) 这个组合给 i>m+1i>m+1i>m+1 的 aia_iai 带来 ≥a1\geq a_1≥a1 的限制。进一步地,可以发现对于 j≤mj\leq mj≤m 的 (j,k)(j,k)(j,k) 组合,它们对 i>m+1i>m+1i>m+1 的 aia_{i}ai 的限制恰是 ≥a1\geq a_1≥a1。
这相当于 am+1,⋯,ana_{m+1},\cdots,a_nam+1,⋯,an 集体减去 a1a_1a1 后都非负,但注意 am+1a_{m+1}am+1 还需是正的。
然后还要枚举 ⟨a1,⋯,am⟩\langle a_1,\cdots,a_m\rangle⟨a1,⋯,am⟩ 中的上升连续对的个数 ttt,以确定 AmA_{m}Am。
那么容易得到:
hn,X=∑a1=1X+1∑m=1n∑t=1mgm,a1,t⋅hn−m,X+t−a1h_{n,X}=\sum_{a_1=1}^{X+1}\sum_{m=1}^n\sum_{t=1}^{m}g_{m,a_1,t}\cdot h_{n-m,X+t-a_1} hn,X=a1=1∑X+1m=1∑nt=1∑mgm,a1,t⋅hn−m,X+t−a1
其中:
设 gn,x,tg_{n,x,t}gn,x,t 表示长度为 nnn 的非负整数数列 ⟨a1,⋯,an⟩\langle a_1,\cdots,a_n\rangle⟨a1,⋯,an⟩ 的个数,满足:
- a1=xa_1=xa1=x,且对于任意 1<i≤n1<i\leq n1<i≤n 有 ai≤a1a_i\leq a_1ai≤a1。
- aaa 是避免 120 的。
- 恰好存在 ttt 个位置 iii(1≤i≤n1\leq i\leq n1≤i≤n,将 a0a_0a0 看作一个负数),使得 ai−1<aia_{i-1}<a_{i}ai−1<ai。
考虑怎么求 gn,x,tg_{n,x,t}gn,x,t。考虑枚举 a2=ya_2=ya2=y。
若 y=xy=xy=x,那么直接从 gn−1,x,tg_{n-1,x,t}gn−1,x,t 转移过来即可;
若 y<xy<xy<x。同样地枚举从 a2=ya_2=ya2=y 开始的极长的一段小于等于 a2a_2a2 的数 a2,⋯,ama_2,\cdots,a_ma2,⋯,am。类似地,对于 j≤mj\leq mj≤m 的 (j,k)(j,k)(j,k) 组合,它们对 i>m+1i>m+1i>m+1 的限制恰是 ≥y\geq y≥y。
从而有:
gn,x,t=gn−1,x,t+∑y=0x−1∑m=1n−1∑c=1mgm,y,c⋅fn−m−1,x−y,t−cg_{n,x,t}=g_{n-1,x,t}+\sum_{y=0}^{x-1}\sum_{m=1}^{n-1}\sum_{c=1}^{m}g_{m,y,c}\cdot f_{n-m-1,x-y,t-c} gn,x,t=gn−1,x,t+y=0∑x−1m=1∑n−1c=1∑mgm,y,c⋅fn−m−1,x−y,t−c
其中:
设 fn,L,tf_{n,L,t}fn,L,t 表示长度为 nnn、值域在 [0,L][0,L][0,L] 的整数数列 ⟨a1,⋯,an⟩\langle a_1,\cdots,a_n\rangle⟨a1,⋯,an⟩ 的个数,满足:
- a1>0a_1>0a1>0。
- aaa 是避免 120 的。
- 恰好存在 ttt 个位置 iii(1≤i≤n1\leq i\leq n1≤i≤n,将 a0a_0a0 看作一个负数),使得 ai−1<aia_{i-1}<a_{i}ai−1<ai。
考虑怎么求 fn,L,tf_{n,L,t}fn,L,t。先枚举 a1∈[1,L]a_1\in[1,L]a1∈[1,L]。类似地枚举极长的一段小于等于 a1a_1a1 的数 a1,⋯,ama_1,\cdots,a_ma1,⋯,am。类似地,对于 j≤mj\leq mj≤m 的 (j,k)(j,k)(j,k) 组合,它们对 i>m+1i>m+1i>m+1 的限制恰是 ≥a1\geq a_1≥a1。
那么:
fn,L,t=∑a1=1L∑m=1n∑c=1mgm,a1,c⋅fn−m,L−a1,t−cf_{n,L,t}=\sum_{a_1=1}^{L}\sum_{m=1}^{n}\sum_{c=1}^{m}g_{m,a_1,c}\cdot f_{n-m,L-a_1,t-c} fn,L,t=a1=1∑Lm=1∑nc=1∑mgm,a1,c⋅fn−m,L−a1,t−c
下图可能可以帮助你更好地理解上述过程:
现在,我们已经可以在 O(N6)O(N^6)O(N6) 的时间复杂度内解决原问题。一个常数优化的小技巧是,注意到 h,g,fh,g,fh,g,f 最后一维记录上升连续对的个数,而这个个数其实在严格的限制下并不多,大概只有序列长度的一半,这样可以省掉很多常数。
事实上,可以注意到所有转移方程都是卷积的形式。我们先考虑用生成函数来表示 fff 和 ggg。
先把 ggg 的转移方程改写如下:
gn,x,t=gn−1,x,t+∑y=0x−1∑m=1n−1∑c=1mgm,y,c⋅fn−m−1,x−y,t−c=∑y=0x∑m=1n−1∑c=1mgm,y,c⋅fn−m−1,x−y,t−c\begin{aligned} g_{n,x,t}&=g_{n-1,x,t}+\sum_{y=0}^{x-1}\sum_{m=1}^{n-1}\sum_{c=1}^{m}g_{m,y,c}\cdot f_{n-m-1,x-y,t-c}\\ &=\sum_{y=0}^{x}\sum_{m=1}^{n-1}\sum_{c=1}^{m}g_{m,y,c}\cdot f_{n-m-1,x-y,t-c}\\ \end{aligned} gn,x,t=gn−1,x,t+y=0∑x−1m=1∑n−1c=1∑mgm,y,c⋅fn−m−1,x−y,t−c=y=0∑xm=1∑n−1c=1∑mgm,y,c⋅fn−m−1,x−y,t−c
这方便于我们列方程。
设 F(x,y,z)F(x,y,z)F(x,y,z) 和 G(x,y,z)G(x,y,z)G(x,y,z) 分别为 f,gf,gf,g 的生成函数。那么有:
{G=xGF+xz1−yF=F(G−xz1−x)+11−y\begin{cases} G=xGF+\frac{xz}{1-y}\\ F=F(G-\frac{xz}{1-x})+\frac{1}{1-y} \end{cases} {G=xGF+1−yxzF=F(G−1−xxz)+1−y1
可能可以半在线卷积。或者可以直接解得:
G=1−y−4(1−x)x(1−y)(x(1−z)−1)+(1−y−x(x−y)(1−z))2+x2(1−z)−x(2−y)(1−z)2(1−x)(1−y)G=\frac{1-y-\sqrt{4(1-x)x(1-y)(x(1-z)-1)+(1-y-x(x-y)(1-z))^2}+x^2(1-z)-x(2-y)(1-z)}{2(1-x)(1-y)} G=2(1−x)(1−y)1−y−4(1−x)x(1−y)(x(1−z)−1)+(1−y−x(x−y)(1−z))2+x2(1−z)−x(2−y)(1−z)
使用三元 GF 应该可以做到 O(n3polylog(n))O(n^3\operatorname{polylog}(n))O(n3polylog(n))。
求 HHH 应该也能用类似半在线卷积的方法加速至 O(n3polylog(n))O(n^3\operatorname{polylog}(n))O(n3polylog(n))?