Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3) C. Success Rate 数学

链接:

http://codeforces.com/contest/807/problem/C

题意:

给你x,y,p,q,现在让x和y分别加上一个数,使得(x+dx)/(y+dy)==p/q。其中dy>=dx>=0,要求加的数最小

题解:

首先需要判断特殊情况,当p=q时,如果x=y,那么就直接输出0,否则输出-1

当p=0时,如果x=0,那么就直接输出0,否则输出-1

然后就是一般情况,令x+dx=np,y+dy=nq。所以dx=np-x,dy=nq-y。

根据dy>=dx>=0可以推出n>=x/p,n>=(y-x)/(q-p)。

所以只需要找出满足条件的最小的n就可以了 

代码:

31 ll gcd(ll a, ll b) {
32     return b == 0 ? a : gcd(b, a%b);
33 }
34 
35 int main() {
36     ll T;
37     cin >> T;
38     while (T--) {
39         ll x, y, p, q;
40         cin >> x >> y >> p >> q;
41         if (p == q) {
42             if (x != y) cout << -1 << endl;
43             else cout << 0 << endl;
44             continue;
45         }
46         if (p == 0) {
47             if (x != 0) cout << -1 << endl;
48             else cout << 0 << endl;
49             continue;
50         }
51         ll t = gcd(p, q);
52         p /= t, q /= t;
53         ll n = max(ceil(1.0*x / p), ceil(1.0*(y - x) / (q - p)));
54         cout << n*q - y << endl;
55     }
56     return 0;
57 }

 

posted @ 2017-05-08 17:46  Flowersea  阅读(197)  评论(0编辑  收藏  举报