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
fact_m = fact(m)
for num in product(range(m+1), repeat=n):
if sum(num) == m:
prod = fact_m
for x in num:
if x>0:
prod = prod * x**(x-1) / fact(x) #cannot be '*=' here!
ans += prod
return ans * fact(n-1) * choose(n+m, n)
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 36 320 3750 54432 941192 18874368
2: 6 36 300 3360 47250 798336 15731352 353894400
3: 24 240 2760 38640 646800 12628224 281781360 7071989760
4: 120 1800 27720 480480 9510480 213373440 5365206000 149582315520
5: 720 15120 302400 6410880 149052960 3824029440 107915734080 3330566553600
6: 5040 141120 3568320 91324800 2476504800 72313274880 2282004204480 77725396869120
'''
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: 24.0 240.0 2760 38640 646800 12628224 281781360 7071989760
(SO)n=4: 120.0 1800.0 27720.0 480480 9510480 213373440 5365206000 149582315520
'''
ZnJvbSBpdGVydG9vbHMgaW1wb3J0IHByb2R1Y3QKZnJvbSBvcGVyYXRvciBpbXBvcnQgbXVsCiAKZGVmIGZhY3QoeCwgYW5zPTEpOgogICAgaWYgeDwyOiByZXR1cm4gYW5zCiAgICBlbHNlOiByZXR1cm4gZmFjdCh4LTEsIHgqYW5zKQogCmRlZiBjaG9vc2UobiwgbSk6CiAgICByZXR1cm4gZmFjdChuKS8oZmFjdChtKSpmYWN0KG4tbSkpCiAKZGVmIGZvbyhuLG0pOgogICAgYW5zID0gMAogICAgZmFjdF9tID0gZmFjdChtKQogCiAgICBmb3IgbnVtIGluIHByb2R1Y3QocmFuZ2UobSsxKSwgcmVwZWF0PW4pOgogICAgICAgIGlmIHN1bShudW0pID09IG06CiAgICAgICAgICAgIHByb2QgPSBmYWN0X20KICAgICAgICAgICAgZm9yIHggaW4gbnVtOgogICAgICAgICAgICAgICAgaWYgeD4wOgogICAgICAgICAgICAgICAgICAgIHByb2QgPSBwcm9kICogeCoqKHgtMSkgLyBmYWN0KHgpICNjYW5ub3QgYmUgJyo9JyBoZXJlIQogICAgICAgICAgICBhbnMgKz0gcHJvZAogCiAgICByZXR1cm4gYW5zICogZmFjdChuLTEpICogY2hvb3NlKG4rbSwgbikKCmZvciBuIGluIHJhbmdlKDEsNyk6CiAgICBwcmludCAnJWQ6JyVuLAogICAgcHJpbnQgJ1x0Jy5qb2luKHN0cihmb28obixtKSkgZm9yIG0gaW4gcmFuZ2UoMSw5KSkKICAgIAonJycKMTogMiAgICA2CTM2CTMyMAkzNzUwCTU0NDMyCTk0MTE5MgkxODg3NDM2OAoyOiA2CTM2CTMwMAkzMzYwCTQ3MjUwCTc5ODMzNgkxNTczMTM1MgkzNTM4OTQ0MDAKMzogMjQJMjQwCTI3NjAJMzg2NDAJNjQ2ODAwCTEyNjI4MjI0CTI4MTc4MTM2MAk3MDcxOTg5NzYwCjQ6IDEyMAkxODAwCTI3NzIwCTQ4MDQ4MAk5NTEwNDgwCTIxMzM3MzQ0MAk1MzY1MjA2MDAwCTE0OTU4MjMxNTUyMAo1OiA3MjAJMTUxMjAJMzAyNDAwCTY0MTA4ODAJMTQ5MDUyOTYwCTM4MjQwMjk0NDAJMTA3OTE1NzM0MDgwCTMzMzA1NjY1NTM2MDAKNjogNTA0MAkxNDExMjAJMzU2ODMyMAk5MTMyNDgwMAkyNDc2NTA0ODAwCTcyMzEzMjc0ODgwCTIyODIwMDQyMDQ0ODAJNzc3MjUzOTY4NjkxMjAKJycnCgpwcmludCAnKFNPKW49MTonLApwcmludCAnXHQnLmpvaW4oc3RyKGkqKihpLTEpKihpKzEpKQogICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgOSkpCgpwcmludCAnKFNPKW49MjonLApwcmludCAnXHQnLmpvaW4oc3RyKGkqKihpLTIpKigyKmktMSkqKGkrMSkqKGkrMikpCiAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxLDkpKQoKcHJpbnQgJyhTTyluPTM6JywKcHJpbnQgJ1x0Jy5qb2luKHN0cihpKiooaS0zKSooNCppKmktNSppKzIpKihpKzEpKihpKzIpKihpKzMpKQogICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSw5KSkKCnByaW50ICcoU08pbj00OicsCnByaW50ICdcdCcuam9pbihzdHIoaSoqKGktNCkqKDQqaS0zKSooMippKmktMyppKzIpKihpKzEpKihpKzIpKihpKzMpKihpKzQpKQogICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSw5KSkKCicnJwooU08pbj0xOiAyCTYJMzYJMzIwCTM3NTAJNTQ0MzIJOTQxMTkyCTE4ODc0MzY4CihTTyluPTI6IDYuMAkzNgkzMDAJMzM2MAk0NzI1MAk3OTgzMzYJMTU3MzEzNTIJMzUzODk0NDAwCihTTyluPTM6IDI0LjAJMjQwLjAJMjc2MAkzODY0MAk2NDY4MDAJMTI2MjgyMjQJMjgxNzgxMzYwCTcwNzE5ODk3NjAKKFNPKW49NDogMTIwLjAJMTgwMC4wCTI3NzIwLjAJNDgwNDgwCTk1MTA0ODAJMjEzMzczNDQwCTUzNjUyMDYwMDAJMTQ5NTgyMzE1NTIwCicnJwo=