[ARC164D]1D Coulomb 题解
[ARC164D]1D Coulomb 题解
题意
在长为 的数轴上放有 个小球,第 个小球在坐标 的位置。 个小球中有 个小球带正电,有 个小球带负点。记第 个小球带 单位电荷(),小球之间受到力的作用,第 个小球受到的力的大小 。小球会进行运动,运动规则如下:
- 当 时第 个小球以每单位时间 单位长度的速度匀速向右运动。
- 当 时第 个小球以每单位时间 单位长度的速度匀速向左运动。
- 当 号球和 号球在某一时刻出现在同一位置并且 时 号球和 号球同时消失,记第 个球在坐标 处消失。
分析可知不会有三个小球同时出现在同一个位置,并且最终所有小球均会消失。
现在给出一个长为 的字符串,当第 个字符为 时表示 ,第 个字符为 时 ,第 个字符为 时表示 不确定。对于所有合法的可能的小球的电性情况求出 的值的和,答案对 取模。
。
题解
先考虑没有问号时如何统计答案:
由于两个小球 当且仅当在 时相撞才会消失,所以小球的消失对于其他小球受力的大小无影响,也就是说小球运动的方向在消失之前不变。
进一步分析可以发现,小球之间的相撞消失类似于括号匹配,例如:
++----+-+-++
这个序列可以分成两段恰好电荷和为 的子段:
++--,--+-+-++
对于第一段我们将 分别视作 。对于第二段我们将 分别视作 。然后就可以匹配了,具体地: 分别进行匹配。
形式化地来说:我们首先将整个序列划分成若干个不相交的极小的电荷和为 的子段,然后对于每一个子段 ,将 这种字符视为 ,另一种字符(即 这种字符)视为 ,然后进行括号匹配,匹配上的两个小球相撞消失。那么答案就是所有配对的小球的坐标差的和。
分析完了相撞的性质,考虑怎样统计答案更方便。直接统计不好做。所以套路的改变求和方式,我们考虑 这个单位长度被多少对配对的小球经过,记为 。换句话说 就是前 个球与后 个球配对的对数,观察可以发现:
那么答案就是 。
以上是对于没有 的情况的答案的计算,下面说一下有 了怎么做。
我们设 表示 的方案数,那么答案就是:
而 可以组合数计算,具体地:
当前 个字符中有 个 , 个 , 个 。整个字符串中有 个 , 个 , 个 ,那么就有:
其中 是枚举 个 中有 个 电荷量为正。
本题到这里就结束了,复杂度 ,代码很短。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现