Vexoben
Sep 2, 2018
题目链接:51Nod1187 寻找分数
(刷新以获取数学公式)
题解
非常高妙的一道题……
首先要发现一个结论:最小等价于最小。
证明比较容易就略过了。
然后考虑几种特殊情况:
1、若 , 那么令 , 求出 得到答案;
2、若 整数部分不同, 令 ,求出 得到答案;
3、否则令,那么求出的答案再加上 就是答案。
如果出现了第三种情况,可以翻转分子分母,得到,向下递归即可。
事实上在部分情况下,情况2的分母需要设置为2,要讨论一下,见代码。
#include<bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int, int>
#define int long long
using namespace std;
const int N = 1e5 + 10;
pii dfs(int a, int b, int c, int d) {
if (!a) {
int x = d / c + 1;
return make_pair(1, x);
}
if (a / b != c / d) {
int x = a / b + 1;
if (c <= d * x) {
x = a / b * 2 + 1;
return make_pair(x, 2);
}
else return make_pair(x, 1);
}
int s = a / b;
a %= b; c %= d;
pii t = dfs(d, c, b, a);
swap(t.fi, t.se);
t.fi += s * t.se;
return t;
}
void Solve() {
int a, b, c, d;
cin >> a >> b >> c >> d;
pii ans = dfs(a, b, c, d);
cout << ans.fi << '/' << ans.se << endl;
}
signed main() {
int T; cin >> T;
while (T--) Solve();
return 0;
}