1. 从跳兽问题
问题描述:
有一只跳兽,每次跳的步数为m,在一个长为n的道路上来回跳。当接近一个端点,且余下的距离又不足一步时,先跳到该端点,再折回,其折回的距离是刚才未跳完的长度。跳兽从一端跳出,问能不能到达距离该端点1米的地方。
分析:
我们不妨将n的道路按照另一个端点对称一下,并且一直延伸下去
得到如下所示的一个道路:
可以发现:夹子的位置是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 (证明过程略)