C题用二分答案. 令 s = b-a; 题意是若s能落在[l,r],[2* l,2* r],[3* l,3* r],.....,[k*l,k *r] (k是非负整数)的某个区间中,就有解,否则无解,只需要两次二分枚举k,一次枚举最大k,一次枚举最小k,即可求解.

#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() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int T = 1;
	cin>>T;;
	while(T--) {
		solve();
	}

}