假设你站在实线上的第0点。在每个步骤中,您可以移动到左侧l个位置,也可以移动到右侧r个位置。你打算到达数字p。此外,还有一些数字不允许您进入。你想知道你可以做多少。提到的所有数字都是整数(当然,l和r为正数)。什么是计算这个的好方法?
请注意。你也可以在旅程中踩到自己,所以在某些情况下答案是无限的。
答案 0 :(得分:0)
它就像“L * x + R * y = P的多少整数(x,y)解”。
我相信这个问题有很多文章。
答案 1 :(得分:0)
这不是一个算法问题,而是一个数学问题。不过,这是解决方案。我们假设您的数字l
和r
是正整数(它们都不为零)。
当且仅当等式r * x - l * y = p
具有非负整数解(x, y)
时,才存在解。该等式表示我们以任意顺序向右x
次向左走{和y
次。这个等式被称为Bézout identity,我们确切地知道它的解决方案是什么样的。
如果gcd(r,l)
除p
,则存在整数解(x0, y0)
,其他每个解的格式都为x = x0 + k * r / gcd(l,r)
,y = y0 + k * l / gcd(l,r)
{{1}遍历整数。显然,如果k
大于k
和-x0 * gcd(l,r) / r
,那么-y0 * gcd(l,r) / l
和x
都是非负的,所以我们有无限多的解决方案。
如果y
没有划分gcd(r,l)
,则没有解决方案,因为左侧始终可以被p
整除,但右侧不是。
总之,您对解决方案进行计数的算法如下所示:
gcd(l,r)
在这一点上,尝试列举所有路径似乎毫无意义,因为这将是一项相当无聊的练习。对于每个非负解if p % gcd(l,r):
return Infinity
else:
return 0
,我们只列举所有可能的方法来安排(x,y)
移动到右边,x
移动到左边。将会有y
个此类路径((x+y)!/(x! * y!)
步骤选择x+y
,这将是右侧的移动。