from itertools import product
from operator import mul
def fact(x, ans=1):
if x<2: return ans
else: return fact(x-1, x*ans)
def choose(n, m):
return fact(n)/(fact(m)*fact(n-m))
def foo(n,m):
ans = 0
for num in product(range(m+1), repeat=n):
if sum(num) == m:
prod = fact(m)
for x in num:
if x>0:
prod *= x**(x-1) / fact(x)
ans += prod * fact(n-1) * choose(n+m,n)
return ans
for n in range(1,7):
print '%d:'%n,
print '\t'.join(str(foo(n,m)) for m in range(1,9))
'''
1: 2 6 24 240 3600 50400 927360 18869760
2: 6 36 240 2520 40320 705600 14515200 333849600
3: 24 240 2400 30240 524160 10644480 246758400 6346771200
4: 120 1800 25200 393120 7620480 174182400 4510598400 128731680000
5: 720 15120 282240 5443200 120476160 3073593600 88136294400 2771024256000
6: 5040 141120 3386880 79833600 2035756800 57959193600 1830744115200 63029904537600
'''
print '(SO)n=1:',
print '\t'.join(str(i**(i-1)*(i+1))
for i in range(1, 9))
print '(SO)n=2:',
print '\t'.join(str(i**(i-2)*(2*i-1)*(i+1)*(i+2))
for i in range(1,9))
print '(SO)n=3:',
print '\t'.join(str(i**(i-3)*(4*i*i-5*i+2)*(i+1)*(i+2)*(i*3))
for i in range(1,9))
print '(SO)n=4:',
print '\t'.join(str(i**(i-4)*(4*i-3)*(2*i*i-3*i+2)*(i+1)*(i+2)*(i*3)*(i+4))
for i in range(1,9))
'''
(SO)n=1: 2 6 36 320 3750 54432 941192 18874368
(SO)n=2: 6.0 36 300 3360 47250 798336 15731352 353894400
(SO)n=3: 18.0 288.0 4140 66240 1212750 25256448 591740856 15429795840
(SO)n=4: 90.0 2160.0 41580.0 823680 17832150 426746880 11266932600 326361415680
'''
ZnJvbSBpdGVydG9vbHMgaW1wb3J0IHByb2R1Y3QKZnJvbSBvcGVyYXRvciBpbXBvcnQgbXVsCgpkZWYgZmFjdCh4LCBhbnM9MSk6CiAgICBpZiB4PDI6IHJldHVybiBhbnMKICAgIGVsc2U6IHJldHVybiBmYWN0KHgtMSwgeCphbnMpCgpkZWYgY2hvb3NlKG4sIG0pOgogICAgcmV0dXJuIGZhY3QobikvKGZhY3QobSkqZmFjdChuLW0pKQoKZGVmIGZvbyhuLG0pOgogICAgYW5zID0gMAoKICAgIGZvciBudW0gaW4gcHJvZHVjdChyYW5nZShtKzEpLCByZXBlYXQ9bik6CiAgICAgICAgaWYgc3VtKG51bSkgPT0gbToKICAgICAgICAgICAgcHJvZCA9IGZhY3QobSkKICAgICAgICAgICAgZm9yIHggaW4gbnVtOgogICAgICAgICAgICAgICAgaWYgeD4wOgogICAgICAgICAgICAgICAgICAgIHByb2QgKj0geCoqKHgtMSkgLyBmYWN0KHgpCiAgICAgICAgICAgIGFucyArPSBwcm9kICogZmFjdChuLTEpICogY2hvb3NlKG4rbSxuKQoKICAgIHJldHVybiBhbnMKCmZvciBuIGluIHJhbmdlKDEsNyk6CiAgICBwcmludCAnJWQ6JyVuLAogICAgcHJpbnQgJ1x0Jy5qb2luKHN0cihmb28obixtKSkgZm9yIG0gaW4gcmFuZ2UoMSw5KSkKICAgIAonJycKMTogMiAgICA2CTI0CTI0MAkzNjAwCTUwNDAwCTkyNzM2MAkxODg2OTc2MAoyOiA2CTM2CTI0MAkyNTIwCTQwMzIwCTcwNTYwMAkxNDUxNTIwMAkzMzM4NDk2MDAKMzogMjQJMjQwCTI0MDAJMzAyNDAJNTI0MTYwCTEwNjQ0NDgwCTI0Njc1ODQwMAk2MzQ2NzcxMjAwCjQ6IDEyMAkxODAwCTI1MjAwCTM5MzEyMAk3NjIwNDgwCTE3NDE4MjQwMAk0NTEwNTk4NDAwCTEyODczMTY4MDAwMAo1OiA3MjAJMTUxMjAJMjgyMjQwCTU0NDMyMDAJMTIwNDc2MTYwCTMwNzM1OTM2MDAJODgxMzYyOTQ0MDAJMjc3MTAyNDI1NjAwMAo2OiA1MDQwCTE0MTEyMAkzMzg2ODgwCTc5ODMzNjAwCTIwMzU3NTY4MDAJNTc5NTkxOTM2MDAJMTgzMDc0NDExNTIwMAk2MzAyOTkwNDUzNzYwMAonJycKCnByaW50ICcoU08pbj0xOicsCnByaW50ICdcdCcuam9pbihzdHIoaSoqKGktMSkqKGkrMSkpCiAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCA5KSkKCnByaW50ICcoU08pbj0yOicsCnByaW50ICdcdCcuam9pbihzdHIoaSoqKGktMikqKDIqaS0xKSooaSsxKSooaSsyKSkKICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEsOSkpCgpwcmludCAnKFNPKW49MzonLApwcmludCAnXHQnLmpvaW4oc3RyKGkqKihpLTMpKig0KmkqaS01KmkrMikqKGkrMSkqKGkrMikqKGkqMykpCiAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxLDkpKQoKcHJpbnQgJyhTTyluPTQ6JywKcHJpbnQgJ1x0Jy5qb2luKHN0cihpKiooaS00KSooNCppLTMpKigyKmkqaS0zKmkrMikqKGkrMSkqKGkrMikqKGkqMykqKGkrNCkpCiAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxLDkpKQoKJycnCihTTyluPTE6IDIJNgkzNgkzMjAJMzc1MAk1NDQzMgk5NDExOTIJMTg4NzQzNjgKKFNPKW49MjogNi4wCTM2CTMwMAkzMzYwCTQ3MjUwCTc5ODMzNgkxNTczMTM1MgkzNTM4OTQ0MDAKKFNPKW49MzogMTguMAkyODguMAk0MTQwCTY2MjQwCTEyMTI3NTAJMjUyNTY0NDgJNTkxNzQwODU2CTE1NDI5Nzk1ODQwCihTTyluPTQ6IDkwLjAJMjE2MC4wCTQxNTgwLjAJODIzNjgwCTE3ODMyMTUwCTQyNjc0Njg4MAkxMTI2NjkzMjYwMAkzMjYzNjE0MTU2ODAKJycnCg==