倒水

题目详情

有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。

我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。

可以进行的操作是:

  1. 把一个容器灌满;
  2. 把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸);
  3. 用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满。
    问是否能够通过有限次操作,使得水缸最后恰好有C升水。


输入:三个整数A, B, C,其中 0 < A , B, C <= 1000000000

输出:0或1,表示能否达到要求。

今天看了一点数论,发现了这道题的解释.

第一个结论是:对于a,b都是c的倍数,则a - b同样是c的倍数,设a = xc ,b = yc,有a - b 等于(x - y)c。

第二个结论是:在形如ax + by的表达式中,设使式子取最小正整数的x,y 为x0,y0,有ax + by 为a * x0 + b * y0的倍数

因为ax + by可以转化为a,b之间的一系列加减操作,故结果总为c的倍数

因为a,b之间的加减运算值总为a,b的最大公约数的倍数,其可能的最小值为gcd(a, b),因为我们可以通过更相减损术求最大公约数,则a * x0 + b * y0可以取到最小值gcd(a,b)

于是有a * x0 + b * y0 == gcd(a , b),并且ab之间的加减操作总是gcd(a, b)的倍数。

感觉自己表达出来了,不知道能否被别人看懂,欢迎大家指正。

注意到gcd(a,b)==gcd(a - b, b)并一直迭代即可求出gcd(a, b),将中间过程展开就是一个形如ax + by的式子,即a*x + b*y = gcd(a, b)有解,即a * x0 + b* y0等于gcd(a,b)
因为ax + by可以转化为a,b之间的一系列加减操作,故结果总为c的倍数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值