专栏文章

CF2140E

CF2140E2题解参与者 3已保存评论 2

文章操作

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

当前评论
2 条
当前快照
1 份
快照标识符
@miny8hqf
此快照首次捕获于
2025/12/02 10:18
3 个月前
此快照最后确认于
2025/12/02 10:18
3 个月前
查看原文
m=2m=2 是很好的提示,我们可以直接状压当前状态(剩下的每一堆是 1 还是 2),dpi,bit,0/1dp_{i,bit,0/1} 表示现在剩下 ii 堆,状态是 bitbitA/BA/B 先手,最终的答案。这个可以轻松枚举下一个丢哪堆,根据博弈逻辑做即可。
然后你考虑把 1 的意义改写为 t(t[1,m])\le t(t\in [1,m]),2 的意义是 >t> t,这样如果某个起始状态的 dp 值是 1,那么意味着这个状态起手,答案会 t\le t。所以对于一个 tt,能让答案 t\le t 的方案数是:
bit[dpn,bit,0=1]tnpopcount(bit)(mt)popcount(bit)\sum_{bit}[dp_{n,bit,0}=1]t^{n-\operatorname{popcount}(bit)}(m-t)^{\operatorname{popcount}(bit)}
后面的幂次是在把 1 替换为 t\le t 的数,2 替换为 >t>t 的数。
这个式子可以预处理 numi=bit[dpn,bit,0=1][popcount(bit)=i]num_i=\sum_{bit}[dp_{n,bit,0}=1][\operatorname{popcount}(bit)=i]O(n)O(n) 计算。对所有 t[1,m]t\in[1,m] 都算一遍(t=mt=m 要特殊处理,应有 mnm^n 种方案)后差分就能得到答案恰好等于 tt 的方案数。然后乘上 tt 求和输出即可。

评论

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

正在加载评论...