1 条题解
-
0
前言(闲话)
我在题解区看到这样一句话:
本题乍一看很简单:这不就是小学数学题吗……
其实这位老哥说得对,这确实是一道小学奥数题。那时我所见的题面是这样的:
求 最小的整数 使得 前几位为
它相当于 的情况,并且正解也是迭代。当时觉得这个做法很美妙,遂将其改写成 OI 题的形式,并写了(错误的)std。这也就成为了我题库中的第一道题。
题解
建议:看一步之后自己向下思考,不会了再继续看
不妨考虑一个例子:
首先看这个假分数就不顺眼,统一减 !
看这个分子上的 也不顺眼,换元,令 !
之后就又回到了题目的形式,但是两边变成了真分数,怎么办?
这是关键的一步,请务必自行思考。
(其实有些初联题也用到了类似的套路,可能让 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 } }证明:当 尽量小时, 也会随之变小。若不满足最优子结构,设换元时 , 为可以使 最优的解,最优子结构为 ,有 (否则 显然不是最优解),故
$$\frac{a}{b}<\frac{r}{q}\leq\frac{r}{q'}\leq\frac{r'}{q'}<\frac{c}{d}$$故 ,所以 ,满足最优子结构
#include <bits/stdc++.h> using namespace std; #define int long long void solve(int a, int b, int c, int d, int& p, int& q) { if(a < b && c > d) //边界情况 p = 1, q = 1; else { solve(d%c, c, b - (d/c)*a, a, q, p); //真分数-(取倒数)->假分数-(化简)->真分数。类似gcd,如果进来的是假分数会取倒数变成真分数,不会死循环 q += (d/c)*p; //回溯时反解出q } } signed main() { int a,b,c,d,p,q; while(cin>>a>>b>>c>>d) { solve(a,b,c,d,p,q); cout<<p<<'/'<<q<<'\n'; } return 0; }
- 1
信息
- ID
- 3852
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 40
- 已通过
- 17
- 上传者