【题解】【P5179 Fraction】
前言(闲话)
我在题解区看到这样一句话:
本题乍一看很简单:这不就是小学数学题吗……
其实这位老哥说得对,这确实是一道小学奥数题。那时我所见的题面是这样的:
求
p+q 最小的整数(p,q) 使得\dfrac{p}{q} 前几位为3.14
它相当于
题解
建议:看一步之后自己向下思考,不会了再继续看
不妨考虑一个例子:
首先看这个假分数就不顺眼,统一减
看这个分子上的
之后就又回到了题目的形式,但是两边变成了真分数,怎么办?
这是关键的一步,请务必自行思考。
(其实有些初联题也用到了类似的套路,可能让 MOer 来做更好一点)
答案是:取倒数。由此得到
之后用类似的方法迭代:
等等,一边是真分数,一边是假分数,这又该怎么办?
其实已经结束了。可以发现,
至此,我们得出答案。
但是还有关键性的一步没有解决:该问题是否满足最优子结构?证明附于文末,请读者自行思考。
至于代码,有些题解分类比较繁琐,其实可以像求
void gcd(int a, int b, int& p, int& q, int c, int d) {
if(a < b && c > d) //边界情况
p = 1, q = 1;
else {
gcd(d%c, c, q, p, b - (d/c)*a, a); //真分数-(取倒数)->假分数-(化简)->真分数。类似gcd,如果进来的是假分数会取倒数变成真分数,不会死循环
q += (d/c)*p; //回溯时反解出q
}
}
证明:当
故