Herausforderung
Stellen wir uns ein N
Tupel von ganzen Zahlen zwischen 0 und M
einschließlich vor und nennen wir es F
.
Insgesamt sind s (M + 1) ** N
möglich F
.
Wie viele solcher F
s erfüllen alle folgenden Ungleichungen (Index ist einsbasiert)?
F[n] + F[n+1] <= M
zum1 <= n < N
F[N] + F[1] <= M
Schreiben Sie ein Programm oder eine Funktion, die zwei positive ganze Zahlen akzeptiert N
und M
die Antwort in einer beliebigen Form ausgibt.
Testfälle
(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
Erläuterung
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)
Regeln
- Dies ist eine Herausforderung mit eingeschränkter Komplexität . Die zeitliche Komplexität Ihres Codes sollte in
M
und polynomisch seinN
(z. B. können Sie nicht alle(M + 1) ** N
Tupel generieren und dann nach der Bedingung suchen). Bitte erläutern Sie Ihren Ansatz in Ihrer Einreichung. - Es gelten die Standardregeln für Code-Golf . Die kürzeste Antwort in Bytes gewinnt.
mat(...,int)
scheint für dien=100
Fälle nicht zu funktionieren . Die Methode ist korrekt (die Verwendung von Sympy zum Summieren der Potenzen der Wurzeln des charakteristischen Polynoms funktioniert beispielsweise), aber Numpy geht irgendwo schief, wenn die Zahlen zunehmen (vielleicht ist es der Potenzoperator**
?)