loj2554

题意

对于一个排列(P),定义映射(f:P ightarrow 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=prodlimits_{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})
(2le lenle 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)就好了

原文地址:https://www.cnblogs.com/Grice/p/12566702.html