循環制限付き合計


10

チャレンジ

N0以上の整数のタプルを想像して、Mそれを呼び出しましょうF

合計での(M + 1) ** N可能性がありますF

F次の不等式をすべて満たすそのようなsはいくつありますか(インデックスは1ベース)。

  • F[n] + F[n+1] <= M ために 1 <= n < N
  • F[N] + F[1] <= M

2つの取るプログラムまたは機能書く正の整数を Nし、Mそして任意の便利な形で答えを出力します。

テストケース

(N,M) => Answer

(1,1) => 1
(2,1) => 3
(3,1) => 4
(4,1) => 7

(1,2) => 2
(2,2) => 6
(3,2) => 11
(4,2) => 26

(10,3) => 39175
(10,4) => 286555
(10,5) => 1508401

(25,3) => 303734663372
(25,4) => 43953707972058
(25,5) => 2794276977562073

(100,3) => 8510938110502117856062697655362747468175263710
(100,4) => 3732347514675901732382391725971022481763004479674972370
(100,5) => 60964611448369808046336702581873778457326750953325742021695001

説明

M (max value of element) = 1

F[1] + F[1] <= 1; F = [0]
(1,1) => 1

F[1] + F[2] <= 1; F = [0,0], [0,1], [1,0]
(2,1) => 3

F = [0,0,0], [0,0,1], [0,1,0], [1,0,0]
(3,1) => 4

F = [0,0,0,0], [0,0,0,1], [0,0,1,0], [0,1,0,0], [0,1,0,1], [1,0,0,0], [1,0,1,0]
(4,1) => 7

---

M = 2

F[1] + F[1] <= 2; F = [0], [1]
(1,2) => 2

F = [0,0], [0,1], [0,2], [1,0], [1,1], [2,0]
(2,2) => 6

F = [0,0,0], [0,0,1], [0,0,2], [0,1,0], [0,1,1], [0,2,0], [1,0,0], [1,0,1],
[1,1,0], [1,1,1], [2,0,0]
(3,2) => 11

(4,2) => 26 (left as exercise for you)

ルール

  • これは課題です。あなたのコードの時間の複雑さは多項式でなければなりませんMし、N(あなたがすべて生成することができません例えば(M + 1) ** Nタプルをして、条件をチェック)。提出する際のアプローチについて説明してください。
  • 標準の規則が適用されます。バイト単位の最短の回答が優先されます。

回答:


7

パイソンnumpyの、59のバイト

lambda M,N:trace(mat(tri(M+1)[::-1])**N)
from numpy import*

オンラインでお試しください!

パスをカウントするために行列乗算を使用します。floatの精度が問題になる場合は、でmatを指定できますmat(...,int)


を使用mat(...,int)してn=100も、ケースが機能しないようです。方法は正しいですが(たとえば、sympyを使用して特性多項式の根の累乗を計算できます)、数値が増えるにつれてnumpyはどこかでうまくいきません(たぶんそれは**べき演算子ですか?)
Jonathan Allan

4

Pyth、27バイト

.N?Ys:RTtYh-QNgQ+NTs:Rdtszh

デモンストレーション

次の形式で入力する必要があります。

M
N

これは古典的な動的プログラミングであり、これまでに設定された値の左端、右端、およびギャップの現在のサイズを超えています。

擬似コード/ Pythonでの仕組み:

.N          | define memoized fill(left, right, gap):
?           | if cap > 0 then
s:RTtY      | sum(fill(i, right, gap - 1)
h-QN        |     for i in range(M - left + 1))
gQ+NT       | else M >= left + right
            | output:
s:Rdtsz     | sum(fill(i, i, N - 1)
h           |     for i in range(M + 1))

Qに使用されているMzに使用されているN:is fillNis leftTis rightYis 、is gapです。


4

MATL13 12バイト

Q:&>~PiY^Xds

オンラインでお試しください!これは、xnorのPython回答と私の最初のMATL回答を直接翻訳したものであるため、最適ではない可能性が高いです。たとえば、左上にある1の三角行列を取得する方法は、より短い可能性がありt&lYRPます。編集:そして、それは、すなわち、あることがわかりました:&>~P。-1バイトのLuis Mendoに感謝します!

               M is the first input and N the second
Q:             increment M and generate range from 1 to M+1
  &>           compare vector element wise with itself with greater-than function
               results in a upper-right triangular matrix
    ~          inverse to get lower-left triangular matrix
     P         flip rows to get upper-left triangular matrix
      i        input N
       Y^      take the matrix to the power of N
         Xds   compute the sum of the main diagonal

@LuisMendoありがとうございます!それは1バイトだけですが、ドロップできる他のものはありますか?
ライコニ

1
いいえ、それだけです。数えられません:-D
Luis Mendo

2

スタックス、17 バイト

°(√&╒íƽ╨⌂'├╖▼1_Z

実行してデバッグする

開梱、ゴルフ、コメントをすると、次のようになります。

^1](    [1, 0, ... 0] with M zeroes
:)      get all rotations of the array
{       begin block
  {:+rm map each array to reverse(prefixSums(arr))
},v*    execute preceding block N-1 times
F       for each array, execute the rest of the program
  iT    remove the last i elements from the array, where i is the iteration index
  F+    add the remaining elements to the running total
        implicitly print output

これを実行


2

R、72バイト

function(M,N)sum(diag(Reduce(`%*%`,rep(list(outer(0:M,0:M,"+")<=M),N))))

オンラインでお試しください!

xnorのアプローチを移植。

Rは32ビット整数しかサポートしていないため(double最大の整数値に到達するとキャストされるため)、より大きなテストケースでは失敗します。そのため、gmpまたは別の任意の精度の算術ライブラリーが必要になります。

奇妙なことに、Rは^常に要素ごとに適用されるため、行列のべき乗演算子がありません。


実際には、-5バイトを許可する適切に実装された%^%演算子がパッケージにありますが、残念ながら、TIOでは使用できません(ローカルでテストする必要がありました)。expm
Kirill L.

@KirillL。ええ、私はそれを考慮しましたが、私はベースR応答に固執すると思います。また、パッケージ全体を読み込まないことで、60バイトまでゴルフできますfunction(M,N)sum(diag(expm::`%^%`(outer(0:M,0:M,"+")<=M,N)))
ジュゼッペ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.