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.
code-golf
restricted-complexity
Bubbler
quelle
quelle
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**
?)Pyth , 27 Bytes
Demonstration
Erwartet Eingaben im Format:
Dies ist eine klassische dynamische Programmierung über dem linken Ende der bisher festgelegten Werte, dem rechten Ende und der aktuellen Größe der Lücke.
Wie es funktioniert, in Pseudocode / Python:
Q
wird verwendet fürM
,z
wird verwendet fürN
,:
istfill
,N
istleft
,T
istright
,Y
istgap
.quelle
MATL ,
1312 BytesProbieren Sie es online aus! Dies ist eine direkte Übersetzung der Python-Antwort von xnor und meiner ersten MATL-Antwort, daher ist sie höchstwahrscheinlich nicht optimal. ZB gibt es wahrscheinlich einen kürzeren Weg, um eine dreieckige Matrix von oben links zu erhalten als
t&lYRP
. Edit: Und es stellt sich heraus, dass es nämlich gibt:&>~P
. Vielen Dank an Luis Mendo für -1 Byte!quelle
Stax , 17 Bytes
Führen Sie es aus und debuggen Sie es
Ausgepackt, ungolfed und kommentiert sieht es so aus.
Führen Sie diesen aus
quelle
R , 72 Bytes
Probieren Sie es online aus!
Ports xnors Ansatz.
Schlägt für größere Testfälle fehl, da R nur 32-Bit-Integer-Unterstützung bietet (sie werden umgewandelt,
double
sobald der maximale int-Wert erreicht ist), sodass die Verwendung einergmp
anderen Arithmetikbibliothek mit beliebiger Genauigkeit erforderlich wäre.Seltsamerweise fehlt R ein
^
Matrixleistungsoperator , wie immer elementweise.quelle
%^%
Operator im Paketexpm
, der -5 Bytes zulässt , aber leider ist er auf TIO nicht verfügbar (ich musste lokal testen).function(M,N)sum(diag(expm::`%^%`(outer(0:M,0:M,"+")<=M,N)))