You are an experienced Codeforces user. Today you found out that during your activity on Codeforces you have made y submissions, out of which x have been successful. Thus, your current success rate on Codeforces is equal to x / y.
Your favorite rational number in the [0;1] range is p / q. Now you wonder: what is the smallest number of submissions you have to make if you want your success rate to be p / q?
The first line contains a single integer t (1 ≤ t ≤ 1000) — the number of test cases.
Each of the next t lines contains four integers x, y, p and q (0 ≤ x ≤ y ≤ 109; 0 ≤ p ≤ q ≤ 109; y > 0; q > 0).
It is guaranteed that p / q is an irreducible fraction.
Hacks. For hacks, an additional constraint of t ≤ 5 must be met.
For each test case, output a single integer equal to the smallest number of submissions you have to make if you want your success rate to be equal to your favorite rational number, or -1 if this is impossible to achieve.
4 3 10 1 2 7 14 3 8 20 70 2 7 5 6 1 1
4 10 0 -1
In the first example, you have to make 4 successful submissions. Your success rate will be equal to 7 / 14, or 1 / 2.
In the second example, you have to make 2 successful and 8 unsuccessful submissions. Your success rate will be equal to 9 / 24, or3 / 8.
In the third example, there is no need to make any new submissions. Your success rate is already equal to 20 / 70, or 2 / 7.
In the fourth example, the only unsuccessful submission breaks your hopes of having the success rate equal to 1.
想写一篇codeforces的题好久了。。可是无奈太菜。。div2场均不过三题
这题蒟蒻以为是二分。。然后写了很久没能写出来(可能我二分太菜。。?)
于是百度一下题解了解一下大神的做法
然后发现了某位大神的题解%%%:http://blog.csdn.net/dormousenone/article/details/71404361
于是发现这题数论可做
这里写一下我的理解:
一般来说,有不可行解的情况要先考虑
于是显然可以发现,
当p/q = 1且x/y != 1时(AC率一百%%%%),不可行
当p = 0且x != 0时,不可行
其他情况一概都是有解的
接下来考虑有解的情况
设a为后来A的题量,b为后来交的次数
显然有
np = x + a
nq = y + b
其中n为自然数
移项
a = np - x
b = nq - y
由题意可知 0 <= a <= b
即0 <= np - x <= nq - y
于是我们可以得到三个不等式
根据不等式的传递性,去掉其中一个,得到:
n >= ceil(x / p)
n >= ceil((x - y) / (p - q))
解一下不等式就好
答案即为b
代码:
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
LL x,y,p,q,t,s;
inline LL getint()
{
LL ret = 0;
char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9')
ret = ret * 10 + c - '0' , c = getchar();
return ret;
}
int main()
{
t = getint();
for (int i = 1; i <= t; i++)
{
x = getint(); y = getint(); p = getint(); q = getint();
if (p == q) {printf("%d\n",x == y? 0 : -1); continue;}
if (p == 0) {printf("%d\n",x == 0? 0 : -1); continue;}
LL n = max(ceil((double)(x) / p),ceil((double)(x - y) / (p - q)));
printf("%I64d\n",n * q - y);
}
return 0;
}