题意:把分数x/y->p/q的最少操作次数,每次可以使y++,x++或者y++ x<=y,p<=q<=1e9
最后若可行肯定是kp/kq=p/q 如果k可行,则说明操作了k*q-y次
判定:x的增加次数不能超过y k*p-x<=k*q-y -> y-x<=k(q-p) 若k可行,则k+1一定也可行,倍数k有单调性,二分即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+20;
ll x,y,p,q;
bool check(ll k)
{
ll a=k*p,b=k*q;
ll d1=a-x,d2=b-y;
if(d1<0||d2<0||d1>d2)
return false;
return true;
}
int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%I64d%I64d%I64d%I64d",&x,&y,&p,&q);
ll l=0,r=1e9;
ll ans=-1;
while(l<=r)
{
//kp/kq=p/q
ll mid=(l+r)>>1;
if(check(mid))
{
ans=mid*q-y;
r=mid-1;
}
else
l=mid+1;
}
printf("%I64d\n",ans);
}
return 0;
}