对于一个长度为 n 的排列 a,定义一次操作为依次对于 i\in[1,n),若 a_i>a_{i+1} 则 swap 它们(即对于序列 a 执行单次冒泡排序的操作)。
现在给你一个序列 ans,其中钦定了一些位置。你要求出有多少个排列 a 使得对 a 进行单次操作后满足 a 和 ans 在钦定的这些位置相等。
先分析题目所说的单次冒泡排序的操作。我们发现假设处理到 a_i,其会跟随 swap 操作一直往后移到第一个大于 a_i 的位置前。即将 a 划分成若干个段,每个段的最大值均为这个段的第一个数,且每一段的第一个数依次递增。然后对于每个段循环向左移位。如下图:
考虑知道了 ans 如何倒着推出 a,此时变成了选出一些段,每个段的最大值必须在其末尾,且若从左往右对段编号,编号小的段的最大值小于编号大的段。每种划分 ans 的方案数都对应着一种合法的 a,我们只需对前者计数即可。