A
注意到 ,考虑把序列按 分块。
每次对于一块 ,考虑把每个数和 问一遍,可以把 个数划分为两个集合。如果两个集合大小不同,那么其中大小较小的就是假币;否则所有假币都在某个集合中,再问一次即可确定哪个集合为假币。
注意一个边界是在最后一块两个集合大小相同时,再问一次会多一次询问,一个办法是把 都和 问,然后根据当前假币个数确定 。
https://atcoder.jp/contests/arc184/submissions/58110108
B
如果两个数 在忽略 质因子后不同,那么 是独立的,可以分开算。
那么现在只需要考虑形如 的数了,把 对应到网格上的 位置,那么操作一次 相当于覆盖了 。令其中的关键点为 。
考虑状压 dp, 表示从下往上考虑到第 行,这一行关键点的集合为 的最少操作次数。转移就是做一个高维前缀 。这样做一次就是 的。整除分块一下可过。
https://atcoder.jp/contests/arc184/submissions/58105316
C
令 代表山折, 代表谷折, 表示第 条折痕的种类。
一个重要的观察是 ,。前一个可以考虑忽略最后一次折叠;后面一个考虑在最后一次折叠前,相邻折痕之间的纸带一定是正反交替的,这个可以归纳证明。
不妨把 改写成更简单的形式:。
注意到把 整体加 后,其相对大小不变。考虑钦定 有最大的 ,设为 ,那么其它的 的 已经确定,再钦定 的第 位即可推出所有 。直接暴力就是 。
https://atcoder.jp/contests/arc184/submissions/58107838
D
首先把两个排列看成平面上 个点 。方便起见,再添加两个虚点 ,。
不难发现,无论如何操作,最终保留的范围一定是若干个左上往右下的矩形,且相邻两个共一个顶点。

于是考虑从左往右 dp, 表示当前矩形的右下角为点 方案数。
转移直接枚举上一个点 ,但是这样会算重,再钦定中间没有点能在不删点的情况下修改范围即可。
https://atcoder.jp/contests/arc184/submissions/58120346
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架