题目描述
游游拿到了一个正整数a,她每次操作可以选择将a加上x,但必须满足l≤x≤r。游游希望操作结束后a恰好等于b。游游想知道,最少需要多少次操作,最多需要多少次操作?
输入描述:
共有t组询问。
每组询问输入四个正整数a,b,l,r。
1≤t≤104
1≤l≤r≤109
1≤a≤b≤109
输出描述:
对于每组询问,输出一行答案。
如果无论如何都不能让a等于b,则输出-1。
否则输出两个整数,分别代表最少操作次数和最多操作次数。
示例1
输入
3
1 6 2 5
1 4 2 2
2 10 2 6
输出
1 2
-1
2 4
说明
第一组询问,操作一次的方案:直接使a加5。操作2次的方案:先加2再加3。
第二组询问,由于只能加2,显然无法使得1变成4。
第三组询问,操作2次的方案:先加3再加5(方案不唯一)。操作4次的方案:加4次2。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int inf = 1e9 + 10;
const int N = 1e6 + 10;
const int mod = 998244353;
int n,m,k,w[N],ans;
map<int,int >mp,ap;
void solve() {
int a,b,l,r;
cin>>a>>b>>l>>r;
int s = b - a;
int mmax = INT_MIN,mmin = INT_MAX;
int tl = 0,tr = 1e9;
while(tr>=tl) {
int mid = (tl + tr) >> 1;
if(mid*l>s)tr = mid - 1;//s小于所枚举区间的左边界,k太大了,要缩小k
else if(r*mid<s)tl = mid+1;//
else {
mmax = mid;
tl = mid+1;//找的是最大k,找到后mmax记录答案,然后再往右边找
}
}
tl = 0,tr = 1e9;
while(tr>=tl) {
int mid = (tl + tr) >> 1;
if(mid*l>s)tr = mid-1;
else if(r*mid<s)tl = mid+1;
else {
mmin = mid;
tr = mid-1;
}
}
if(mmin==INT_MAX||mmax==INT_MIN)cout<<-1<<endl;
else cout<<mmin<<" "<<mmax<<endl;
}
signed main() {
int T = 1;
cin>>T;;
while(T--)
{
solve();
}
}