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 }