[ABC433F] 1122 Subsequence 2
题目链接
题目大意
给你一个由数字组成的字符串\(S\),求出有多少\(S\)的子序列(不一定连续的)\(T\)满足以下条件:
- \(T\)非空
- \(T\)的长度为偶数
- \(T\)的前一半的所有数字相同
- \(T\)的后一半的所有数字相同
- \(T\)的前一半的数字+1等于后一半的数字
对998244353取模
解决方法
前置知识:范德蒙德卷积\(\sum\limits_{i=0}^{n}C_{n}^{i}C_{m}^{k-i}=C_{n+m}^{k}\)
设\(S\)的长度为\(n\)
显然有一个\(O(n^3)\)的做法:
考虑枚举后一半数字的第一个的位置\(i\)
设后一半的数字为\(c\),则前一半的数字为\(c-1\)
设位置\(j\in[1,i-1]\)的数字\(c-1\)的出现次数为\(c1\),位置\(j\in[i,n]\)的数字\(c\)的出现次数为\(c2\)
枚举\(len\)表示\(T\)的长度的一半
显然\(1\leq len\leq\min(c1,c2)\)
对于前一半数字,就是在\(c1\)个位置中选\(len\)个,方案数\(C_{c1}^{len}\)
对于后一半数字,由于我们已经确定第\(i\)个位置必选,所以就是在\(c2-1\)个位置中选\(len-1\)个,方案数\(C_{c2-1}^{len-1}\)
因此,答案要累加\(C_{c1}^{len}C_{c2-1}^{len-1}\)
即:
考虑优化
定义\(pcnt_{i,j}\)表示\(1\sim i\)的数字中,数字\(j\)出现了几次,\(scnt_{i,j}\)表示\(i\sim n\)的数字中,数字\(j\)出现了几次
那么显然可以\(O(n)\)求得
此时总时间复杂度为\(O(n^2)\)
继续优化
将后边的\(\sum\limits_{len=0}^{\min(c1,c2)}C_{c1}^{len}C_{c2-1}^{len-1}\)提出来看
这个\(\min(c1,c2)\)不好处理,考虑分类讨论
-
当\(c1\leq c2\)时
则原式可化为
\[\begin{split} &\sum\limits_{len=0}^{c1}C_{c1}^{len}C_{c2-1}^{len-1}\\ &=\sum\limits_{len=0}^{c1}C_{c1}^{len}C_{c2-1}^{c2-len} \end{split} \]容易发现这是个范德蒙德卷积
因此答案就是为\(C_{c1+c2-1}^{c2}\)
-
当\(c1>c2\)时
则原式可化为
\[\sum\limits_{len=0}^{c2}C_{c2-1}^{len-1}C_{c1}^{len} \]将\(len\)整体改为\(len-1\)得
\[\sum\limits_{len=-1}^{c2-1}C_{c2-1}^{len}C_{c1}^{len+1} \]因为\(C_{c2-1}^{-1}=0\),所以\(len=-1\)的情况对答案无影响
于是得到:
\[\begin{split} &\sum\limits_{len=0}^{c2-1}C_{c2-1}^{len}C_{c1}^{len+1}\\ &=\sum\limits_{len=0}^{c2-1}C_{c2-1}^{len}C_{c1}^{c1-len-1} \end{split} \]容易发现这也是个范德蒙德卷积
因此答案就是为\(C_{c1+c2-1}^{c1-1}=C_{c1+c2-1}^{c2}\)
综上所述,\(\sum\limits_{len=0}^{\min(c1,c2)}C_{c1}^{len}C_{c2-1}^{len-1}=C_{c1+c2-1}^{c2}\)
因此,\(ans=\sum\limits_{i=1}^{n}C_{c1+c2-1}^{c2}\)
浙公网安备 33010602011771号