专栏文章

题解:AT_xmascon21_c Count Me

AT_xmascon21_c题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqm6roq
此快照首次捕获于
2025/12/04 07:04
3 个月前
此快照最后确认于
2025/12/04 07:04
3 个月前
查看原文
看了下大佬们的题解,我不觉得这个把 01\texttt{01} 看成不等号的等价转换是人类能想出来的东西,来一个我自己的思考过程吧。
本题还有一个思考方向:保留 ?\texttt{?},去掉 1\texttt{1},通过容斥算贡献。

直接考虑题目中的过程,为了不算重,考虑加一个限制:每次删掉的数要满足 i=nsisi+1i=n \vee s_i\neq s_{i+1}
首先我们考虑一个基本的问题:对于一个长度为 nn 的全问号串,求 fnf_n
考虑枚举我们现在删掉了哪个位置,设为 pp
我们此时需要确定 pp 上的数是什么东西。现在我们翻开这个问号,发现 sp=1s_p=\texttt{1},则根据限制可以推得 sp+1=0s_{p+1}=\texttt{0};同理如果 sp=0s_p=\texttt{0},则 sp+1=1s_{p+1}=\texttt{1}
这一步相当于说,我们翻开了相邻的两个位置,并且删除了左边那个数。这里可以利用 01\texttt{01} 的对称性重新用问号盖上右边那个数,这样就划归到了子问题 fn1f_{n-1}
特别的,如果 p=np=n,则右边没有数,需要算两次贡献。
得到递推式 fn=(n+1)fn1f_n=(n+1)f_{n-1},所以 fn=(n+1)!f_n=(n+1)!
接下来考虑有一些位置是 0\texttt{0} 的情况。我们现在假设 0\texttt{0} 在中间形成了一个长度为 ll 的连续段,整个串长度为 nn,设答案为 fn,lf_{n,l}
手玩以下有边界条件 fn,n=1,fn,0=(n+1)!f_{n,n}=1,f_{n,0}=(n+1)!
枚举我们现在删掉了哪个位置。不同于之前的是,我们事先知道了一些位置上的值为 0\texttt{0},需要在这个情况下计算方案数。
  • 如果 p=np=nspsp+1=??s_ps_{p+1}=\texttt{??},分析同上,fn1,lfn,lf_{n-1,l}\to f_{n,l} 贡献 nln-l 次。
  • 如果 spsp+1=?0s_p s_{p+1} = \texttt{?0},则这个问号下只能是 1\texttt{1}fn1,lfn,lf_{n-1,l}\to f_{n,l}
  • 如果 spsp+1=0?s_p s_{p+1} = \texttt{0?},则问号下的数是 1\texttt{1},可以用 1=?0\texttt{1}=\texttt{?}-\texttt{0} 容斥掉,fn1,l1fn1,lfn,lf_{n-1,l-1}-f_{n-1,l} \to f_{n,l}
整理一下, fn,l=(nl)fn1,l+fn1,l1f_{n,l}=(n-l) f_{n-1,l}+f_{n-1,l-1},得到 fn,l=(n+1)!(l+1)!f_{n,l}=\frac {(n+1)!}{(l+1)!}
归纳可得,如果存在多段连续的 0\texttt{0},则答案为 (n+1)!(n+1)! 除以所有连续段长度加一的阶乘。
我们现在将原字符串中的 1\texttt{1} 拆成 ?0\texttt{?}-\texttt{0},设 dpi,ldp_{i,l} 表示当前考虑到为止 ii,最后一段长度为 ll 的答案的带容斥系数和。
  • 如果 si=0s_i=\texttt{0},则 dpi,l1×1l+1dpi+1,ldp_{i,l-1}\times \frac 1 {l+1}\to dp_{i+1,l}
  • 如果 si=?s_i=\texttt{?},则 dpi,ldpi+1,0dp_{i,l}\to dp_{i+1,0}
  • 如果 si=1s_i=\texttt{1},则 dpi,l1×1l+1dpi+1,ldp_{i,l-1}\times \frac {-1} {l+1}\to dp_{i+1,l}dpi,ldpi+1,0dp_{i,l}\to dp_{i+1,0}
事实上状态数少的可怜,在模拟赛里能骗 80pts。(骄傲)
会了 O(n2)O(n^2) 做法,剩下的就很简单了。
我们得先把这个 dp 式子压成一维的,枚举上一个被钦定为问号的位置 jj,则 i,ji,j 中间夹着的东西全是 0\texttt{0},贡献为 (1)cnt1(len+1)!(-1)^{\mathrm{cnt}}\frac 1 {(\mathrm{len}+1)!} ,可以拆成只和 i,j,jii,j,j-i 有关的形式。使用分治 NTT 复杂度可以做到 O(nlog2n)O(n\log ^2 n)

评论

0 条评论,欢迎与作者交流。

正在加载评论...