cCache = dict(((0,)*i, 1) for i in range(20))
def c(a):
try:
return cCache[a]
except KeyError:
res = sum(d(i, a) for i in range(len(a)))
cCache[a] = res
return res
dCache = dict()
def d(i, a):
try:
return dCache[(i, a)]
except KeyError:
if a[i] == 0:
return 0
aa = list(a)
aa[i] -= 1
aa = tuple(aa)
res = c(aa) - d(i, aa)
dCache[(i, a)] = res
return res
print(c((3, 2, 2)))
Y0NhY2hlID0gZGljdCgoKDAsKSppLCAxKSBmb3IgaSBpbiByYW5nZSgyMCkpCmRlZiBjKGEpOgogICAgdHJ5OgogICAgICAgIHJldHVybiBjQ2FjaGVbYV0KICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICByZXMgPSBzdW0oZChpLCBhKSBmb3IgaSBpbiByYW5nZShsZW4oYSkpKQogICAgICAgIGNDYWNoZVthXSA9IHJlcwogICAgICAgIHJldHVybiByZXMKCmRDYWNoZSA9IGRpY3QoKQpkZWYgZChpLCBhKToKICAgIHRyeToKICAgICAgICByZXR1cm4gZENhY2hlWyhpLCBhKV0KICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICBpZiBhW2ldID09IDA6CiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgYWEgPSBsaXN0KGEpCiAgICAgICAgYWFbaV0gLT0gMQogICAgICAgIGFhID0gdHVwbGUoYWEpCiAgICAgICAgcmVzID0gYyhhYSkgLSBkKGksIGFhKQogICAgICAgIGRDYWNoZVsoaSwgYSldID0gcmVzCiAgICAgICAgcmV0dXJuIHJlcwoKcHJpbnQoYygoMywgMiwgMikpKQo=