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

本文解析了CodeForces竞赛中一道数学问题的解决思路,给出了一种通过寻找最小公倍数来确定如何同时增加两个变量的方法,以满足特定的比例关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接:

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 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值