真的是蓝题?这真的不是小学数学题?
我们是要求满足(其中 \(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';
}
}
标签:qq,cj,pp,frac,cout,int,题解,CF773A
From: https://www.cnblogs.com/2021cjx-akioi/p/17810666.html