[ABC433F] 1122 Subsequence 2

题目链接

atcoder

洛谷

题目大意

给你一个由数字组成的字符串\(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}\)

即:

\[ans=\sum\limits_{i=1}^{n}\sum\limits_{len=0}^{\min(c1,c2)}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)\)不好处理,考虑分类讨论

  1. 当\(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}\)

  2. 当\(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}\)

posted on 2026-10-19 20:17  Qinluyan  阅读(3)  评论(0)    收藏  举报