CF773A 题解

发布时间 2023-11-05 16:32:13作者: 2021cjx

真的是蓝题?这真的不是小学数学题?

我们是要求满足(其中 \(a\) 为正确数,\(b\) 为总数)

\[\frac{x + a}{y + b} = \frac{p}{q} \]

的最小 \(b\)

我们可以先把右式的分子分母变化到与 \(\frac{x}{y}\) 类似的大小。

int bs1 = x / p + (x % p != 0);
int bs2 = y / q + (y % q != 0);
int bs = max(bs1,bs2);
pp = p * bs;
qq = q * bs;

然后判断,如果 \(x\)\(pp\) 的差值小于 \(y\)\(qq\) 的差值就可以输出了。

否则继续放大。

如果 \(p \geq q\)(其实就是 \(p = q\)),那么放大是无效的。

然后没了。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int t;
signed main()
{
    cin>>t;
    while(t--)
    {
        int x,y,p,q,pp,qq;
        cin>>x>>y>>p>>q;
        if(p == 0)
        {
            if(x != 0)cout<<-1<<'\n';
            else cout<<0<<'\n';
            continue;
        }
        int bs1 = x / p + (x % p != 0);
        int bs2 = y / q + (y % q != 0);
        int bs = max(bs1,bs2);
        pp = p * bs;
        qq = q * bs;
        if(pp - x > qq - y && p >= q)cout<<-1<<'\n';
        else if(pp - x > qq - y)
        {
            int cj = pp - x - qq + y;
            int num = cj / (q - p) + (cj % (q - p) != 0);
            pp += num * p;
            qq += num * q;
            cout<<qq - y<<'\n';
        }
        else cout<< qq - y <<'\n';
    }
}