Biorąc pod uwagę m
przez n
czekolady, m,n
pozytywny, wyjście na wiele sposobów przełamania pasek do mn
1 za 1 szt, w których występuje każda przerwa na linii siatki.
Porządek jest ważny. Kawałki są również rozróżnialne, więc dwa kawałki na obu końcach tabliczki czekolady 1 na 3 nie są równoważne.
Na przykład dla bloku 2 na 2 mamy:
_ _ _ _ _ _ _ _
|_‖_| -> |‗| |_| -> |_| |‗| -> |_| |_|
|_‖_| |_| |_| _ |_| _ _
|_| |_| |_|
_ _ _ _ _ _ _ _
|_‖_| -> |_| |‗| -> |‗| |_| -> |_| |_|
|_‖_| |_| |_| |_| _ _ _
|_| |_| |_|
_ _ _ _ _ _ _ _
|‗|‗| -> |_‖_| -> |_| |_| -> |_| |_|
|_|_| _ _ _ _ _ _
|_|_| |_‖_| |_| |_|
_ _ _ _ _ _ _ _
|‗|‗| -> |_|_| -> |_‖_| -> |_| |_|
|_|_| _ _ _ _ _ _
|_‖_| |_| |_| |_| |_|
Dlatego istnieją 4 sposoby na rozbicie tabliczki czekolady 2 na 2.
Zasady
Wejściami będą dwie liczby całkowite poprzez funkcję input, STDIN, wiersz poleceń lub podobny. Podaj jedną liczbę, liczbę sposobów na rozbicie tabliczki czekolady.
Ponieważ liczby rosną dość szybko, nie martw się, jeśli wynik przekroczy limity liczb całkowitych twojego języka - przesłanie będzie ważne, dopóki algorytm teoretycznie działa dla wszystkich możliwych danych wejściowych.
Przypadki testowe
Dane wyjściowe nie zależą od kolejności m,n
, więc przypadki testowe są wymienione tak, że m <= n
.
1 1 -> 1
1 2 -> 1
1 3 -> 2
1 4 -> 6
1 5 -> 24
1 10 -> 362880
2 2 -> 4
2 3 -> 56
2 4 -> 1712
2 5 -> 92800
2 10 -> 11106033743298560
3 3 -> 9408
3 4 -> 4948992
3 5 -> 6085088256
3 10 -> 76209753666310470268511846400
4 4 -> 63352393728
A261964 to liczby czekoladowe ułożone w trójkąt, tak aby każdy rząd odpowiadał sumie m+n
.
źródło
options(expressions=...)
i argumentu--max-ppsize=
) spowoduje, że kod będzie dłuższy niż ten.f=
.Python 2, 135 bajtów
Oto co wymyśliłem. Jest naprawdę wolny, ale tutaj jest szybsza wersja (wymaga repoze.lru ):
Przykłady
Wyjaśnienie
Kod definiuje funkcję,
C
która pobiera tablicę elementów. Algorytm jest taki:for i,Q in enumerate(A)
: pętla w szeregu elementów.for W,H in(Q,Q[::-1])
: obliczyć dwa razy, obracając o 90 stopni.for c in range(1,W)
: pętla przez możliwe pozycje do podziału na.A[:i]+A[i+1:]+[(c,H),(W-c,H)]
: uzyskaj listę bez podzielonego elementu i dwóch nowych elementów.C(…)
: ponownie wywołaj funkcję na tej liście.sum(…)
: zsumuj wyniki dla każdego możliwego podziału.or 1
: jeśli podział nie jest możliwy, istnieje dokładnie jeden sposób na podzielenie czekolady.Na koniec kod jest wywoływany z tablicą zawierającą dane wejściowe.
źródło
ES6, 141 bajtów
Na podstawie wzoru znalezionego przez @CameronAavik. Nie golfowany:
źródło