実線上の点 0 に立っているとします。各ステップで、左に l か所、または右に r か所移動できます。あなたは数pに到達するつもりです。また、踏んではいけない数字もあります。これができる回数を数えてください。言及されているすべての数値は整数です (もちろん、l と r は正です)。これを数えるための良い方法は何でしょうか?
ノート。旅の途中で p 自体を踏むこともできるので、場合によっては答えは無限大です。
これはアルゴリズムの問題ではなく、数学の問題です。それにもかかわらず、ここに解決策があります。l
数値とが正の整数であると仮定しましょうr
(いずれもゼロではありません)。
r * x - l * y = p
解が存在するのは、方程式に非負の整数解がある場合だけです(x, y)
。この式は、任意の順序で、x
右に2 回、左に 2 回歩いたことを表しています。y
この方程式はベズー恒等式として知られており、その解がどのように見えるかは正確にわかっています。
gcd(r,l)
が割り切れる場合p
、整数解 が存在し、(x0, y0)
他のすべての解は の形式x = x0 + k * r / gcd(l,r)
になります。ここで、整数y = y0 + k * l / gcd(l,r)
がk
実行されます。明らかに、 ifはとthenと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
x
「L*x+R*y=P の整数(x,y) 解はいくつあるか」のようなものです。
この問題に関する記事はたくさんあると思います。