这道题 要求求最小满足条件的提交次数 ,条件为(x+Successful Submission)/(y+Submission)= p / q 。
即为 x+Successful Submission = p * n 且 y+Submission = q * n 。
我们二分查找的就是这个n
还有隐藏条件 a > = 0 && b > = 0 && a < = b 这些就是check条件。
二分答案 本身就满足单调性 所以不用证明
#include <iostream>
using namespace std;
typedef long long ll;
int main()
{
int cases;
cin >> cases;
while(cases--)
{
int x,y,p,q;
cin >> x >> y >> p >> q;
ll l=0,r=1e9;
ll ans=-1;
while(l<=r)
{
// (x+a)/(y+b)=p/q
// x+a =p*n
// y+b =q*n
ll mid=(l+r)/2;
ll a=p*mid-x;
ll b=q*mid-y;
if(a>=0 && b>=0 && a<=b) // check条件
{
ans=mid;
r=mid-1;
}
else
{
l=mid+1;
}
}
if(ans==-1) cout << ans << endl;
else cout << ans*q-y << endl; // 不能直接输出 ans 这个是 n
}
}
其实 我想了一下 应该可以用ex_gcd()做 但是 条件略多
这道题如果用ex_gcd()做的话 可能会爆ll 所以不能
其实可以直接用不等式做出来