排列的单调且连续的区间一定互不相交,且由 a 可以推出这些区间。
如果 a={3,3,3,1,1,1},那么区间就是 {[1,3],[4,4],[5,5],[6,6]}。
设 a′ 表示 a 的相同数连续段长度,那么 a′={3,1,1,1}。
将 [1,n] 分配,方案数有 ∣a∣! 种,如上面的例子,如果取数顺序为 3,1,2,4,那么区间 [1,3] 分到了 2,3,4,可以推出排列 p 为 2,3,4,5,1,6 或 4,3,2,5,1,6。
发现长度 ≥2 的区间都有两种选择,方案数乘上 2x,x 表示长度 ≥2 的区间个数。
然后出现问题,我们可能分配出来,使相邻的两个区间组成大区间,考虑把这些情况排除。
容易想到容斥,令 fi 表示至少 i 对相邻区间合并,那么有:
ans=i=0∑len−1(−1)if(i)
分析完了,考虑 dp
。
设 fi,j 表示考虑前 i 个区间,并成 j 段的方案数,枚举上一段结束的位置 l,若 i=l+1 且 ai′=1,那么 fl,j−1→fi,j;否则 fl,j−1×2→fi,j。
最终 ans=i=1∑m(−1)m−ii!fm,i。
前缀和优化可以做到 O(n2)。
然后就过了????
容易发现合并段数不能丢,然后如果左边 x 段,右边 y 段,就会合并成 x+y 段,贡献是乘积。
考虑分治 NTT
,在中间要处理区间的合并。