Loading

AGC054E ZigZag Break

对于原问题的操作,可以考虑倒序插入,算合法的排列个数。而由于题目保证了选择的三个元素连续,所以我们只需要按某种顺序插入,考虑插入时相邻两数的关系,而不需要考虑全局的信息。

令一开始 \(p_{1}=X,p_{n}=Y\),那么 \(X\)\(Y\) 交换答案不会发生改变,所以不妨设 \(X<Y\),那么对于 \(<X\) 元素的插入,尽量从大到小,\(>Y\) 的元素的插入,尽量从小到大,对于中间的元素,只有当两侧不分别为 \(<X\) 元素与 \(>Y\) 元素才合法。实际上我们将这 \(3\) 中元素标号为 \(A,B,C\) 那么唯一不合法的情况就是 \(AB,BA\) 中插 \(C\),对于其他情况可以按序插入使其合法。

那么对于两个 \(A\) 或两个 \(B\) 中的元素,中间按序插入一定合法,但由于两侧分别取到 \(A,B\) 所以中间必然有一个 \(AB\) 位置,在这里插入不合法。但可以发现这样的 \(AB\) 位置只要存在一个满足中间没有元素,那么即可以合法,反之必存在一个 \(C\) 插入不了。所以原问题等价于数存在 \(AB\) 子串的序列个数

这个问题很好解决,\(ans=(n-1)!-{cnt_{A}+cnt_{C}-1\choose cnt_{C}-1}{cnt_{B}+cnt_{C}-1\choose cnt_{C}-1}cnt_{A}!cnt_{B}!cnt_{C}!\)

由于要对这个东西快速求和,\(cnt_{A}\) 是固定的,所以 \(cnt_{B}+cnt_{C}\) 是固定的,两边同时乘上 \(cnt_{A}!\) 即可转化为类似组合数列 \(k\) 次方求和的形式,转为 \((x+t)^{\overline k}\)即可快速计算。

posted @ 2022-12-14 22:05  zhouhuanyi  阅读(67)  评论(0)    收藏  举报