loj2554

题意

对于一个排列\(P\),定义映射\(f:P\rightarrow l\)\(l_i\)\(P\)中第\(i\)个位置最靠左的位置使得区间\([i-l_i+1,i]\)\(P\)上对应的整数集合是连续的
给定\(l\),求有多少不同的\(P\)通过\(f\)映射后为\(l\)

做法

对于\(n\)对区间\([l_i,i]\),要么相离要么包含,抽象成一棵树

对于一个点,令其区间长度为\(len\),有\(k\)个儿子,要将\([1,len]\)分配给\(k\)个儿子,满足

  • 每个儿子内都是连续的
  • 将儿子离散成一个数字时,没有非平凡的连续区间

\(f_i\)为:没有非平凡连续区间的\(i+1\)排列个数
\(Ans=\prod\limits_{i=1}^n f_{l_i}\)

边界情况\(f_0=1,f_1=2\),通式:

\[f_{n}=(n-1)f_{n-1}+\sum_{i=2}^{n-2}(i-1)f_if_{n-i} \]

证明:
将一个合法数组\(A\)映射到\(B\)\(b_{a_i}=i\)
\(A\)没有非平凡连续区间的\(\Longrightarrow\)\(B\)不存在不包含最大元素的非平凡连续区间
已插入\([1,n]\),将元素整体\(+1\),现在考虑往里面插\(1\)
\(1)~~\)原序列已合法
只要\(1\)不在\(2\)旁边就好了。有\(n+1-2=n-1\)个位置
\(2)~~\)原序列不合法
最多有一个极长区间不合法,设其长度为\(len\),则原值域为\([x,x+len-1]\),然后把\(1\)插进去破坏
只考虑这部分,方案数为\(f_{len}\),相当于把\(1\)当做里面的\(len+1\)
再考虑\(x\)的范围,\([2,n-len]\):如果左端点为\(1\)则插进来没法破坏,如果右端点为\(n-len+1\)则极大区间为整个序列。所以要乘个\(n-len-1\)的系数
然后把这个区间缩成一个点,由于只有一个区间不合法,剩下的方案数为\(f_{n-len}\)
\(2\le len\le n-2\),左端点右端点要满足区间非平凡
显然\(\sum_{i=2}^{n-2}(n-i-1)f_if_{n-i}=\sum_{i=2}^{n-2}(i-1)f_if_{n-i}\)

直接分治\(fft\)就好了

posted @ 2020-03-25 15:50  Grice  阅读(131)  评论(0)    收藏  举报