题意:某人很喜欢一个比例p/q.现在他在oj上交题,成功率为y/x,为了使成功率到达他最喜欢的比率,他该交多少题,如果无法达到,输出-1
思路:假设交题ac次数为B,交题总数A
p/q = (x+B)/(y+A) => (p*k)/(q*k) = (x+B)/(y+A)
x+B = p*k => B=p*k-x
y+A = q*k => A=q*k-y and A>=B
k越小,A和B越小,找到满足条件的最小k,计算答案
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int main()
{
int x,y,p,q,t;
//freopen("in.txt","r",stdin);
scanf("%d",&t);
//p/q = y+B/x+A => (p*k)/(q*k) = x+B/y+A
//y+B = p*k => B=p*k-x
//x+A = q*k => A=q*k-y and A>=B
int d=__gcd(p,q);
p/=d;q/=d;
while(t--)
{
scanf("%d%d%d%d",&x,&y,&p,&q);
ll l=0;
ll r=10000000000;
ll ans=-1;
while(r>=l)
{
ll mid=(l+r)/2;
ll A = q*mid-y;
ll B = p*mid-x;
if(A>=0&&B>=0&&A>=B)
{
ans=mid;
r=mid-1;
}
else
l=mid+1;
}
if(ans==-1)
printf("-1\n");
else
printf("%I64d\n",ans*q-y);
}
}