$2020.11.21$ 模拟赛

T1 Jams 倒酒(pour)

题目大意:给出两个容积分别为a和b的酒杯与一个装有无限多酒的酒桶。规定以下三种操作:用酒桶中的酒将容积为b的酒杯填满、将容积为a的酒杯中的酒全部倒入酒桶中、将容积为b的酒杯中的酒倒入容积为a的酒杯中。其中在进行第三种操作时,若容积为a的酒杯在倒了一部分酒后就达到了容积,那么剩余的酒将留在容积为b的酒杯中。求无限次操作后,能在容积为a的酒杯中倒出的最小体积的酒以及第二种操作和第一种操作(在倒出的酒的体积不变的情况下)的最小操作数。

我们经过观察,发现题目可以转化成:对于不定方程\(bx - ay = d\),求出最小的\(d、y、x\)。为了便于用\(exgcd\)计算,我们将不定方程\(bx - ay = d\)转换为\(bx + ay = d\),要求求出的值也变成了\(d、-y、x\)。

定理\(1\):对于不定方程\(bx + ay = d\),最小的\(d\)为\(\gcd(a, b)\)。

证:设存在\(d_0 < \gcd(a, b)\),则有\(bx_0 + ay_0 = d_0\)。

将不定方程\(bx_0 + ay_0 = d_0\)两边同时除以\(\gcd(a, b)\),得到\(\dfrac{bx_0}{\gcd(a, b)} + \dfrac{ay_0}{\gcd(a, b)} = \dfrac{d_0}{\gcd(a, b)}\)。

因为\(a \mid\gcd(a,b), \space b \mid\gcd(a, b)\),所以\((\dfrac{bx_0}{\gcd(a, b)} + \dfrac{ay_0}{\gcd(a, b)}) \mid 1\),\(\dfrac{d_0}{\gcd(a, b)} \mid 1\)。

因为\(d_0 < \gcd(a, b)\),所以\(\dfrac{d_0}{\gcd(a, b)} \nmid 1\),与上述证明冲突。

证毕。

随后我们使用\(exgcd\)求出不定方程\(bx + ay = \gcd(a, b)\)的一组特解\(x_0、y_0\)。由于操作数必须为正整数,所以需要将\(y_0\)变为最小正整数。设新的一组特解为\((x_1, y_1)\),则\(y_1= y_0 + \lfloor \dfrac{y_0\gcd(a, b)}{a} \rfloor * y_0\)。将\(y_1\)代入不定方程\(bx_1 + ay_1 = \gcd(a, b)\),得出\(x_1\)的值。输出\(d、-y、x\)即可。

上一篇:【AI】_00_基础番外篇


下一篇:python – roc_auc_score – y_true中只有一个类