Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3) A Is it rated?
地址:http://codeforces.com/contest/807/problem/C
题目:
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, or 3 / 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.
思路:略
1 #include <bits/stdc++.h>
2
3 using namespace std;
4
5 #define MP make_pair
6 #define PB push_back
7 typedef long long LL;
8 typedef pair<int,int> PII;
9 const double eps=1e-8;
10 const double pi=acos(-1.0);
11 const int K=1e6+7;
12 const int mod=1e9+7;
13
14 int p,x,y;
15
16 int main(void)
17 {
18 //std::ios::sync_with_stdio(false);
19 //std::cin.tie(0);
20 int n;
21 LL x,y,p,q,x1,x2,ans;
22 scanf("%d",&n);
23 for(int i=1;i<=n;i++)
24 {
25 scanf("%I64d%I64d%I64d%I64d",&x,&y,&p,&q);
26 if(p==0)
27 {
28 if(x!=0)
29 printf("-1\n");
30 else
31 printf("0\n");
32 }
33 else if(p==q)
34 {
35 if(x!=y)
36 printf("-1\n");
37 else
38 printf("0\n");
39 }
40 else
41 {
42 x1=(q*x-y*p)/p;
43 if(x1*p<(q*x-y*p))
44 x1++;
45 x2=(y*p-x*q)/(q-p);
46 if(x2*(q-p)<(y*p-x*q))
47 x2++;
48 ans=max(x1,x2)+y;
49 if(ans%q)
50 ans=((ans/q)+1)*q-y;
51 else
52 ans=ans-y;
53 printf("%I64d\n",ans);
54 }
55
56 }
57 return 0;
58 }
作者:weeping
出处:www.cnblogs.com/weeping/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。