【题解】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}
\]