【题解】CF156C Cipher 传递性 计数 容斥 (目前暂未清楚如何构造方案)

题目链接

令字符串每个位置的权值 \(S[i] \gets str[i]\ - \ 'a' + 1\)

那么我们要解决的问题即存在多少权值序列 \(T\) 可以被 \(S\) 操作出来。

一个广为人知的结论:如果允许我们交换任意相邻位置 \(i,i+1\) ,那么我们一定可以交换任意位置 \(i,j\)

那么对于本题而言我们可以通过传递性操作使得任意两个位置 \(i,j\) 在合法的前提下令 \(w[i] \gets w[i]+1,w[j] \gets w[j]-1\)\(w[i]\gets w[i]-1,w[j]\gets w[j]+1\)

(把xa....zy转化成ax....yz做。)

考虑所有 \(\sum_{i=1}^na_i=S,\forall a_i\in[1,m]\) 的等价类,对于该等价类的任意两个序列都可以通过该种操作使其完全相等

(因为可以令一个位置 + 1,一个位置 -1,因此一定可以调整到想要的方案。)

思考:对于等价类内的任意两个序列,怎么构造方案调整。

那么我们要求的即 \(\sum_{i=1}^na_i=S,\forall a_i\in[1,m]\) 的等价类的大小。

可以使用容斥原理在 \(O(n+S)\) 的时间内求出。

容斥枚举有多少个位置 \(>m\) 即可。

\[\sum_{i=1}^n(-1)^i\binom{n}{i}\binom{S-i\times m-1}{n-1} \]

代码记录

posted @ 2021-09-11 14:10  Themaxmaxmax  阅读(38)  评论(0编辑  收藏  举报