关于扩展欧几里德算法的几个问题

1. 从跳兽问题

问题描述:

有一只跳兽,每次跳的步数为m,在一个长为n的道路上来回跳。当接近一个端点,且余下的距离又不足一步时,先跳到该端点,再折回,其折回的距离是刚才未跳完的长度。跳兽从一端跳出,问能不能到达距离该端点1米的地方。


分析:

我们不妨将n的道路按照另一个端点对称一下,并且一直延伸下去

得到如下所示的一个道路:

关于扩展欧几里德算法的几个问题_第1张图片

可以发现:夹子的位置是2yn±1。而跳兽每次跳到的位置是mx

所以就得到一个方程式:mx+2ny=1

这样我们就可以用扩展欧几里德算法来判断有没有解:即gcd(2n,m)=1便能到达,否则无法到达。


2.Magic Horse

问题描述:

在一个相当大的棋盘上,有一只Magic Horse,每次能跳一个a×b大小的位置,问这只Magic Horse能走遍整个棋盘吗?


分析:

由于是无穷大的棋盘,肯定是不能用枚举法来做的。如果能够跳到旁边的格子,必然能够跳到所有的位置。

可以发现:从(0,0)出发,可以到以下八个位置:

(a,b) (a,-b) (-a,b) (-a,-b) (b,a) (b,-a) (-b,a) (-b,-a)

所以经过若干次跳动之后,所能到达的位置一定是:

dx=p1a+q1b

dy=p2a+q2b

所以只需要gcd(a,b)=1即可。


但是这只是一个条件,还有一个隐含条件。

从起点跳到相邻的一点,坐标之和的奇偶性一定发生了变化。如果a和b的奇偶性相同,那么不论怎么跳,坐标之后的奇偶性不会发生改变。所以a和b的奇偶性不同。


3. 邮票问题

问题描述:

给你两种面额的邮票A,B。问能否用A、B组成所有大于0的不同面额。如果可以,输出0。如果不能,输出有几种面额无法组合而得,如果无法组成的情况有无穷多种,输出"infinite"。


分析:

首先可以列出Ax+By=1的方程,如果gcd(A,B)!=1。那么对于1,1+A×B,1+2×A×B,……都无法表示为A,B的组合。

如果gcd(A,B)=1,那么又有多少种是无法组成的呢。

首先可以证明所有大于A×B的都可以表示出来。(证明比较复杂,有兴趣的可以参阅《ACM/ICPC程序设计与分析》,(沈云付))

其次是求出小于A×B的这些数当中,那些是不可以表示为A,B的组合的

可以用枚举法,一一枚举。这里给出一个公式 S=(A-1)×(B-1)/2 (证明过程略)

你可能感兴趣的:(扩展欧几里德算法)