专栏文章
题解:AT_abc408_g [ABC408G] A/B < p/q < C/D
AT_abc408_g题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mip54n1m
- 此快照首次捕获于
- 2025/12/03 06:19 3 个月前
- 此快照最后确认于
- 2025/12/03 06:19 3 个月前
正文开始
阅读理解
给出 ,,,,求最小满足 的 。
思路
先从特殊情况入手,当 且 时,很明显,最小的 即为 。
那我们思路就很明确了,将 和 化成 且 的形式,再对 与 进行回溯。
怎么转化呢?我们可以循环以下步骤:
- 当 且 时,将不等式 变为
- 当 且 时,将不等式 变为
- 当 且 时,将 与 赋值为 ,然后回溯。
注意:需要记录变化过程,建议使用递归。
回溯过程:
- 当上一步是将不等式 变为 时,将 变为 。
- 当上一步是将不等式 变为 时将 变为
最后再输出 即可。
代码
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
int p,q;
inline void dfs(int a,int b,int c,int d){
int m=a/b;
if(a>=b&&c>=d){
dfs(a-m*b,b,c-m*d,d);
p+=m*q;
}
else if(a<b&&c>d)p=q=1;
else {
dfs(d,c,b,a);
swap(p,q);
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int T;cin>>T;
while(T--){
int A,B,C,D;
cin>>A>>B>>C>>D;
dfs(A,B,C,D);
cout<<q<<'\n';
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...