倒水

题目详情

有两个容器,容积分别为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的倍数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Unity中实现倒水效果可以通过使用物理引擎和粒子系统来实现。 首先,在场景中创建一个杯模型,并将其放置在需要倒水的位置上。可以使用Unity内置的3D模型或导入其他3D模型。 接下来,创建一个空物体并将其重命名为“Water”。将该物体作为子物体放置在杯中。 然后,你需要在“Water”物体上添加一个刚体组件,以便在倒水时模拟物理效果。将刚体的重力设置为0,以避免从杯子底部漏出。 接下来,添加一个粒子系统组件并命名为“WaterParticleSystem”。将该组件的发射器形状设置为“Cone”,以便在一定范围内发射粒子。设置发射速度和生命周期以模拟倒水效果。 最后,在代码中添加以下脚本: ``` using UnityEngine; public class PourWater : MonoBehaviour { public ParticleSystem waterParticleSystem; private bool isPouring = false; void Update() { if (Input.GetMouseButtonDown(0)) { isPouring = true; waterParticleSystem.Play(); } if (Input.GetMouseButtonUp(0)) { isPouring = false; waterParticleSystem.Stop(); } if (isPouring) { transform.Rotate(Vector3.right * Time.deltaTime * 100f); } } } ``` 此脚本会检测鼠标是否按下并发射粒子。当鼠标按下时,粒子系统将开始发射粒子。同时,物体将开始旋转以模拟倒水效果。当鼠标松开时,粒子系统将停止发射粒子。 你还可以使用声音效果和其他视觉效果来增强倒水效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值