acwing-193. 算乘方的牛
考点
- IDAstar
- 剪枝
- 最大公约数
题解
1 |
|
思路
只能使用DFS,且要找最少,考虑IDAstar
由于只涉及到乘除法,所以只需要在乎幂次即可,令工作变量1的幂次为a,工作变量2的幂次为b;
那么初始状况下a = 1, b = 0
搜索顺序优化:
- 同样的扩展分支,显然先扩展大的数更快到达目标,令
a一定大于等于b
可行性剪枝:
当前搜索层数大于阈值,剪枝
如果
P不是gcd(a, b)的倍数,剪枝因为很显然,
P = ax + by,而gcd(a, b) = e,显然P / e应该是整数
估价函数:
如果
(a << (mxdep - dep)) < P,剪枝当前只剩
mxdep - dep次翻倍的机会,每次都翻倍更大的a都无法到达P,显然应该剪掉
接下来讨论有几种情况:
一共只有以下8种情况,
(a + a, a),(a + a, b),(b + b, a),(b + b, b),(a + b, a)和(a + b, b),(a - b, a)和(a - b, b)
a一定大于等于b,而b - a一定是小于等于0的,负数相当于回头,所以(b - a, a)和(b - a, b)舍去;
(a - a, a),(a - a, b),(b - b, a),(b - b, b)这四种带0的也舍去,是减法的特例,不需要重复枚举。