Algorithm 枚举路径的算法

Algorithm 枚举路径的算法,algorithm,counting,Algorithm,Counting,假设你站在实线的0点。在每个步骤中,您可以移动到左侧l位置,也可以移动到右侧r位置。你打算去p号。此外,还有一些数字是不允许您使用的。你想计算一下你能做多少。当然,所有提到的数字都是正整数l和r。什么是计算这个的好方法 注意。你也可以在旅途中踩到p本身,因此在某些情况下答案是无穷大。这就像有多少整数x,y解,L*x+R*y=p一样 我相信有很多关于这个问题的文章。它就像有多少整数x,y解与L*x+R*y=p一样 我相信有很多关于这个问题的文章。这不是一个算法问题,而是一个数学问题。然而,解决办法

假设你站在实线的0点。在每个步骤中,您可以移动到左侧l位置,也可以移动到右侧r位置。你打算去p号。此外,还有一些数字是不允许您使用的。你想计算一下你能做多少。当然,所有提到的数字都是正整数l和r。什么是计算这个的好方法


注意。你也可以在旅途中踩到p本身,因此在某些情况下答案是无穷大。

这就像有多少整数x,y解,L*x+R*y=p一样


我相信有很多关于这个问题的文章。

它就像有多少整数x,y解与L*x+R*y=p一样


我相信有很多关于这个问题的文章。

这不是一个算法问题,而是一个数学问题。然而,解决办法是这样的。让我们假设你的数字l和r是正整数,它们都不是零

当且仅当方程r*x-l*y=p具有非负整数解x,y时,才存在解。这个方程表达了这样一个事实:我们以任意顺序向右走x次,向左走y次。这个方程被称为,我们精确地知道它的解是什么样的

如果gcdr,l除以p,则存在整数解x0,y0,并且每一个其他解的形式为x=x0+k*r/gcdl,r,y=y0+k*l/gcdl,r,其中k穿过整数。显然,如果k大于-x0*gcdl,r/r和-y0*gcdl,r/l,那么x和y是非负的,所以我们有无穷多的解

如果gcdr,l不除以p,那么就没有解,因为左手边总是能被gcdl,r整除,而右手边却不能

总之,计算解决方案的算法如下所示:

if p % gcd(l,r):
    return Infinity
else:
    return 0

在这一点上,尝试列举所有路径似乎没有意义,因为这将是一个相当枯燥的练习。对于每个非负解x,y,我们简单地列举所有可能的方式来安排x向右移动,y向左移动。将会有x+y/x!*Y在x+y步之间的路径选择x,这将是向右移动。

这不是一个算法问题,而是一个数学问题。然而,解决办法是这样的。让我们假设你的数字l和r是正整数,它们都不是零

当且仅当方程r*x-l*y=p具有非负整数解x,y时,才存在解。这个方程表达了这样一个事实:我们以任意顺序向右走x次,向左走y次。这个方程被称为,我们精确地知道它的解是什么样的

如果gcdr,l除以p,则存在整数解x0,y0,并且每一个其他解的形式为x=x0+k*r/gcdl,r,y=y0+k*l/gcdl,r,其中k穿过整数。显然,如果k大于-x0*gcdl,r/r和-y0*gcdl,r/l,那么x和y是非负的,所以我们有无穷多的解

如果gcdr,l不除以p,那么就没有解,因为左手边总是能被gcdl,r整除,而右手边却不能

总之,计算解决方案的算法如下所示:

if p % gcd(l,r):
    return Infinity
else:
    return 0

在这一点上,尝试列举所有路径似乎没有意义,因为这将是一个相当枯燥的练习。对于每个非负解x,y,我们简单地列举所有可能的方式来安排x向右移动,y向左移动。将会有x+y/x!*Yx+y步之间的路径选择x,x将向右移动。

如果在点0 r=3,您可以走到1、2、3还是只走到3?您必须直接走到r=3。如果有一个循环,例如,在0 r=3,在3 l=3,该怎么办?事实上,如果有两种方法到达终点线,那么一定会有一个循环。如果允许你踩到每个数字,这很容易,因为答案要么是零,要么是无穷大。取决于l和r的最大公约数是否除以p。@robert:l和r在整个过程中是固定的。答案可以是无穷大。如果在点0R=3,你能走到1,2,3还是只走到3?你必须直接走到r=3。如果有一个循环,比如在点0R=3,在点3L=3,会怎么样?事实上,如果有两种方法到达终点线,那么一定会有一个循环。如果允许你踩到每个数字,这很容易,因为答案要么是零,要么是无穷大。取决于l和r的最大公约数是否除以p。@robert:l和r在整个过程中是固定的。答案可以是无穷大。