前言
虽然在很久很久以前刚入门ACM的时候就已经知道辗转相除法的存在,并且也用GCD解了不少题,不过说实话辗转相除法的原理一直不是很清楚。
直到最近做到这样一道题: Codeforces - 343A,本以为是一道憨批构造,结果构造了两个小时都没出来,立刻自闭。
看了题解之后当即觉得基础数论白学了。毕竟能够证明 gcd ( a , b ) = gcd ( b , a m o d b ) \gcd(a, b) = \gcd(b, a \bmod b) gcd(a,b)=gcd(b,amodb)并不代表对其有直观的理解。
后来终于在中文维基上找到了辗转相除法的直观展示,出于加强记忆以及造福他人的缘由,决定自己也多做几个例子来展示。
图解
首先通过几个例子图解辗转相除法,以直观地进行理解其正确性。
在理解了其直观含义后,再对Codeforces - 343A进行讲解。
第一个例子
无中生有地想两个数字出来作为例子是很困难的(大嘘),所以我请出了我最信赖的随机数生成器(棒读):
>>> from random import randint
>>> print(randint(1, 20), randint(1, 20))
12 10
于是我们将通过一个 12 × 10 12 \times 10 12×10的矩形来理解这一算法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-htIoX7Fl-1574695509619)(图解辗转相除法\12by10.png)]
min ( 12 , 10 ) = 10 \min(12, 10) = 10 min(12,10)=10,所以,我们从中削去 10 × 10 10\times 10 10×10大小的矩形:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XyMy8tsL-1574695509620)(图解辗转相除法\12by10_1.png)]
现在我们还剩下一个 2 × 10 2 \times 10 2×10的矩形。可以认为问题被转化成了求 gcd ( 2 , 10 ) \gcd(2, 10) gcd(2,10)。
min ( 2 , 10 ) = 2 \min(2, 10) = 2 min(2,10)=2,所以我们从中削去尽可能多的 2 × 2 2\times 2 2×2的矩形:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Re8ivD4u-1574695509622)(图解辗转相除法\12by10_2.png)]
简直完美!最后还剩下 2 × 2 2\times 2 2×2的矩形。这说明 gcd ( 12 , 10 ) = 2 \gcd(12, 10) = 2 gcd(12,10)=2,因为 gcd ( 2 , 2 ) = 2 \gcd(2, 2) = 2 gcd(2,2)=2。
第二个例子
上一个例子的 gcd = 2 \gcd = 2 gcd=2,所以这一次我们来看看 gcd = 1 \gcd = 1 gcd=1的例子:
>>> print(randint(1, 20), randint(1, 20))
17 5
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WEpeWvHO-1574695509625)(图解辗转相除法\17by5.png)]
首先,重复上面的步骤,首先尽可能多地削去 5 × 5 5 \times 5 5×5:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AXevs1EP-1574695509627)(图解辗转相除法\17by5_2.png)]
可以看到蓝色的部分变成了 2 × 5 2 \times 5 2×

本文通过图解方式深入浅出地解析了辗转相除法的原理,将其与电阻网络构建巧妙结合,展示了如何利用辗转相除法解决Codeforces-343A题目中的电阻网络构建问题。

9912

被折叠的 条评论
为什么被折叠?



