P1763 埃及分数
考点
- 迭代加深
- 剪枝
- 最大公约数
题解
1 |
|
思路
根据题意:
加数少的比加数多的好
选择迭代加深,控制枚举位数
加数个数相同的,最小的分数越大越好
枚举每一位置的分数时,从大到小枚举优化搜素顺序
因为很显然,大数中找最大值与小数中找最大值,显然前者可能性更大
在这里,不要妄想同时枚举分子和分母,因为最大范围有1e7
,是天文数字;只考虑枚举分母即可
分母的下界
在枚举分母之前一定要对a / b
进行约分保证最简
假设当前有a / b
,需要将其转换为1 / i
由于a / b
已经约分后最简了,那么必然有: \[
\frac{a}{b}>\frac{1}{i}\Rightarrow i>\frac{b}{a}
\]
又因为我们是从大到小枚举,且题目声明分母不准相同,那么本次的分母i
应该大于上一次的分母:
\[
i>path\left[ d-1 \right]
\] 所以得到分母的下界:
1 | ll l = max(b / a + 1, path[d - 1] + 1); |
分母的上界
因为1 / i
小于a / b
,那么肯定还有剩余,剩余部分就作为下一次递归的输入;
算上当前位置,最多还有depth - d + 1
个位置,而后续每个位置的分母必大于i
,取极值的话,必有:
\[
\frac{1}{i}\cdot \left( depth-d+1 \right) \leqslant \frac{a}{b}
\]
由于题目要找最小值的最大,假设当前i
都比ans[depth]
都大,说明1 / i
比答案都小,那么直接用答案来剪枝即可
最终得到了上界
1 | ll r = min((ll)1e7, (depth - d + 1) * b / a); |
递归输入
综上,因为1 / i
必小于a / b
,所以还有剩余,剩余部分的分子就等于a * i - b
,分母就等于b * i
得到如下代码:
1 | for (ll i = l; i <= r; ++i) { |
答案
枚举到最后两位时,考虑用数学进行优化 \[
\frac{ak}{bk}=\frac{1}{x}+\frac{1}{y}
\]
倒数第二位置的分母为x
,倒数第一位置的分母为y
,消去y
后得到二元一次不等式
\[
\begin{cases}
ak=x+y\\
bk=xy\\
\end{cases}\Rightarrow x^2-akx+bk=0
\]
那么可以通过枚举k
,通过求根公式得到x
和y
的值;由于题目说了不能有重复分母,可以得到k
的范围:
\[
\varDelta =a^2k^2-4bk>0\Rightarrow k>\frac{4b}{a^2}
\] 令\(\sqrt{a^2k^2-4bk}\)为r
,根据求根公式:
\[
\frac{ak\pm \sqrt{a^2k^2-4bk}}{2}
\]
得到x = (a * k - r) / 2
,y = (a * k + r) / 2
需要满足以下条件即可:
y < 1e7
r
是整数且大于0,小于0说明无解,等于0说明两根相同(a * k - r)
可以整除2,保证x
和y
都是整数