Loading

12.10 CW 模拟赛 T2. 乘法

算法

剪枝怎么都过不去 \(50 \%\) , 红温了

不管了

容易想到的是, 枚举最终 \(B\) 进制数的位数, 然后进行一个搜索来确定答案

这样不够优秀, 考虑折半搜索, 我们将 \(B\) 进制数分为两个部分, 然后分别判断两个部分对 \(n\) 取余的值 , 若可以, 考虑归并

具体怎么操作呢?

对于左右具体选择的情况, 我们可以考虑状态压缩
选择情况不重时, 我们再想办法合并答案
一种合并的方法是, 对于两个部分的答案先排序, 然后找两个最大和次大的即可

实现

框架

先读入

枚举位数 \(\Theta (B)\) , 对于每一种位数, 我们都可以 \(\Omega\left(\frac{B}{2}!\right)\) 处理出两个部分的所有答案, 然后我们就可以对于 \(\Theta (2 ^ B)\) 种情况进行一个处理

时间复杂度 \(\mathcal{O} \left[B \left(\frac{B}{2}! + 2 ^ B\right)\right]\)

代码

后补

总结

暴力算法不能通过但是有很接近的时候, 折半搜索是个好东西

折半搜索的常用方法:

  1. 先搜索
  2. 合并
    一般来说是存在数组里, 排序之后直接合并
    可以使用 : 二分 / 哈希表
posted @ 2024-12-11 16:08  Yorg  阅读(3)  评论(0编辑  收藏  举报