题解:AT_abc408_g [ABC408G] A/B < p/q < C/D
这是一个类欧几里得算法的经典题。
Part.1 前置知识
欧几里得算法:
如果你要求
欧几里得证明出,如果不停地如此递归直至
简单证明一下,假设
否则,有
其实类欧几里得算法的精髓就是锁定原函数中的两个参数
Part.2 本题思路
首先,要求最小的
如果此时
否则我们可以弄一下倒数,那么限制条件变为
原式变为
先将当前
锁定
Part.3 代码
接下来上满级小清新代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
int p,q;
void solve(int a,int b,int c,int d){
if (a<b&&c>d) p=1,q=1;
else{
swap(p,q);
solve(d%c,c,b-(d/c)*a,a);
swap(p,q);
q+=(d/c)*p;
}
}
signed main(){
int t; cin>>t;
while (t--){
int a,b,c,d; cin>>a>>b>>c>>d;
solve(a,b,c,d);
cout<<q<<"\n";
}
}
Part.4 后记
其实类欧几里得算法是一个奇妙的技巧。
比赛时只有
我看赛时我的学伴们好多人都会,甚至有一个人排到了前十名,而我排名 505,痛掉 13 分,但是我赛后了解到了这个技巧并学习了它。
我想,排名和 rated 并不是最重要的,增长经验才是打比赛的真正目的吧。至此,我推荐大家多打打比赛,让自己在千锤百炼中顽强成长吧!