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的也舍去,是减法的特例,不需要重复枚举。