def f(n):
return 1 if n<1 else 6*f(n-1) + sum(f(i)*f(n-2-i) for i in xrange(n-1))
def h(x):
if x=='': return 1
if len(x)==1: return ' +-<>,.'.find(x)
if x[0]!='[':
return (h(x[0])-1) * f(len(x)-1) + h(x[1:])
d=i=1
while d:
if x[i]==']': d-=1
elif x[i]=='[': d+=1
i+=1
a=i-2
b=len(x)-i
return 6*f(a+b+1) + sum(f(i)*f(a+b-i) for i in range(a)) + (h(x[1:i-1])-1) * f(b) + h(x[i:])
def g(x):
return sum(f(i) for i in xrange(len(x))) + h(x)
def enumerate(n):
if n==0: return ['']
a=[]
for c in '+-<>,.':
for x in enumerate(n-1):
a+=[c+x]
for i in range(n-1):
for x in enumerate(i):
for y in enumerate(n-2-i):
a+=['['+x+']'+y]
return a
def verify():
i=1
for n in range(7):
for x in enumerate(n):
if g(x)!=i:
print i,g(x),x
1/0
i+=1
print 'n=%d done'%n
print 'ok'
def test():
i=1
for n in range(7):
a=enumerate(n)
for x in a:
print i,x
i+=1
print 'for n=%d, there are %d valid programs'%(n,len(a))
verify()
ZGVmIGYobik6CiAgICByZXR1cm4gMSBpZiBuPDEgZWxzZSA2KmYobi0xKSArIHN1bShmKGkpKmYobi0yLWkpIGZvciBpIGluIHhyYW5nZShuLTEpKQoKZGVmIGgoeCk6CiAgICBpZiB4PT0nJzogcmV0dXJuIDEKICAgIAogICAgaWYgbGVuKHgpPT0xOiByZXR1cm4gJyArLTw+LC4nLmZpbmQoeCkKICAgIAogICAgaWYgeFswXSE9J1snOgogICAgICAgIHJldHVybiAoaCh4WzBdKS0xKSAqIGYobGVuKHgpLTEpICsgaCh4WzE6XSkKICAgIAogICAgZD1pPTEKICAgIHdoaWxlIGQ6CiAgICAgICAgaWYgeFtpXT09J10nOiBkLT0xCiAgICAgICAgZWxpZiB4W2ldPT0nWyc6IGQrPTEKICAgICAgICBpKz0xCiAgICAKICAgIGE9aS0yCiAgICBiPWxlbih4KS1pCiAgICAKICAgIHJldHVybiA2KmYoYStiKzEpICsgc3VtKGYoaSkqZihhK2ItaSkgZm9yIGkgaW4gcmFuZ2UoYSkpICsgKGgoeFsxOmktMV0pLTEpICogZihiKSArIGgoeFtpOl0pCgpkZWYgZyh4KToKICAgIHJldHVybiBzdW0oZihpKSBmb3IgaSBpbiB4cmFuZ2UobGVuKHgpKSkgKyBoKHgpCgpkZWYgZW51bWVyYXRlKG4pOgogICAgaWYgbj09MDogcmV0dXJuIFsnJ10KICAgIAogICAgYT1bXQogICAgCiAgICBmb3IgYyBpbiAnKy08PiwuJzoKICAgICAgICBmb3IgeCBpbiBlbnVtZXJhdGUobi0xKToKICAgICAgICAgICAgYSs9W2MreF0KICAgIAogICAgZm9yIGkgaW4gcmFuZ2Uobi0xKToKICAgICAgICBmb3IgeCBpbiBlbnVtZXJhdGUoaSk6CiAgICAgICAgICAgIGZvciB5IGluIGVudW1lcmF0ZShuLTItaSk6CiAgICAgICAgICAgICAgICBhKz1bJ1snK3grJ10nK3ldCiAgICAKICAgIHJldHVybiBhCgpkZWYgdmVyaWZ5KCk6CiAgICBpPTEKICAgIAogICAgZm9yIG4gaW4gcmFuZ2UoNyk6CiAgICAgICAgZm9yIHggaW4gZW51bWVyYXRlKG4pOgogICAgICAgICAgICBpZiBnKHgpIT1pOgogICAgICAgICAgICAgICAgcHJpbnQgaSxnKHgpLHgKICAgICAgICAgICAgICAgIDEvMAogICAgICAgICAgICBpKz0xCiAgICAgICAgcHJpbnQgJ249JWQgZG9uZSclbgogICAgCiAgICBwcmludCAnb2snCgpkZWYgdGVzdCgpOgogICAgaT0xCiAgICBmb3IgbiBpbiByYW5nZSg3KToKICAgICAgICBhPWVudW1lcmF0ZShuKQogICAgICAgIAogICAgICAgIGZvciB4IGluIGE6CiAgICAgICAgICAgIHByaW50IGkseAogICAgICAgICAgICBpKz0xCiAgICAgICAgCiAgICAgICAgcHJpbnQgJ2ZvciBuPSVkLCB0aGVyZSBhcmUgJWQgdmFsaWQgcHJvZ3JhbXMnJShuLGxlbihhKSkKCnZlcmlmeSgp