/
Narayana.py
45 lines (32 loc) · 1021 Bytes
/
Narayana.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
from functools import cache
from _tabltypes import MakeTriangle
"""Narayana triangle.
[0] 1;
[1] 0, 1;
[2] 0, 1, 1;
[3] 0, 1, 3, 1;
[4] 0, 1, 6, 6, 1;
[5] 0, 1, 10, 20, 10, 1;
[6] 0, 1, 15, 50, 50, 15, 1;
[7] 0, 1, 21, 105, 175, 105, 21, 1;
[8] 0, 1, 28, 196, 490, 490, 196, 28, 1;
[9] 0, 1, 36, 336, 1176, 1764, 1176, 336, 36, 1;
"""
@cache
def narayana(n: int) -> list[int]:
if n < 3:
return [[1], [0, 1], [0, 1, 1]][n]
a = narayana(n - 2) + [0, 0]
row = narayana(n - 1) + [1]
for k in range(n - 1, 1, -1):
row[k] = (
(row[k] + row[k - 1]) * (2 * n - 1)
- (a[k] - 2 * a[k - 1] + a[k - 2]) * (n - 2)
) // (n + 1)
return row
@MakeTriangle(narayana, "Narayana", ["A090181", "A001263", "A131198"], True)
def Narayana(n: int, k: int) -> int:
return narayana(n)[k]
if __name__ == "__main__":
from _tabltest import TablTest
TablTest(Narayana)