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]\)
代码
后补
总结
暴力算法不能通过但是有很接近的时候, 折半搜索是个好东西
折半搜索的常用方法:
- 先搜索
- 合并
一般来说是存在数组里, 排序之后直接合并
可以使用 : 二分 / 哈希表