파이썬 3, 108 바이트
C=lambda l,r,o=():((l,r)>=o)*l*r%2+sum(C(l-x,r-y,(x,y))for x in range(1,l,2)for y in range(1,r,2)if(x,y)>=o)
모든 세트를 재귀 적으로 열거하므로 항상 세트를 순서대로 생성하여 복제되지 않도록하십시오. 을 사용하여 메모 할 때는 상당히 빠르지 C = functoools.lru_cache(None)(C)
만, 반드시 필요한 것은 아닙니다 n = 11
.
C(num_white, num_black)
결과를 얻으려면 전화 하십시오. 첫 커플 n
:
1: 1
3: 2
5: 4
7: 12
9: 32
11: 85
13: 217
15: 539
17: 1316
19: 3146
21: 7374
결과를 생성하려면 다음을 수행하십시오.
def odd_parts(l, r, o=()):
if l % 2 == r % 2 == 1 and (l, r) >= o:
yield [(l, r)]
for nl in range(1, l, 2):
for nr in range(1, r, 2):
if (nl, nr) < o: continue
for t in odd_parts(l - nl, r - nr, (nl, nr)):
yield [(nl, nr)] + t
예 : (7, 7) :
[(7, 7)]
[(1, 1), (1, 1), (5, 5)]
[(1, 1), (1, 1), (1, 1), (1, 1), (3, 3)]
[(1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1)]
[(1, 1), (1, 1), (1, 1), (1, 3), (3, 1)]
[(1, 1), (1, 3), (5, 3)]
[(1, 1), (1, 5), (5, 1)]
[(1, 1), (3, 1), (3, 5)]
[(1, 1), (3, 3), (3, 3)]
[(1, 3), (1, 3), (5, 1)]
[(1, 3), (3, 1), (3, 3)]
[(1, 5), (3, 1), (3, 1)]