def heuristic(n):
if n&3:
return 1,'0'*n
if n==4:
return 4,'0001'
for ones in xrange(1,n/2-1):
def recurse(i,x,onesleft):
if not onesleft:
b=(x<<(n/2)) | (((1<<(n/2))-1)^x)
for flip in xrange(n/2):
x=y=b^(1<<flip)
m=1
while 1:
y=((y&1)<<(n-1))|(y>>1)
if bin(x^y).count('1')!=n/2:
break
m+=1
if m==n/2:
return m,bin((1<<n)|x)[3:]
return
for j in xrange(i,n/2-onesleft):
r=recurse(j+1,x|(1<<j),onesleft-1)
if r: return r
r=recurse(0,0,ones)
if r: return r
print 'failed'
1/0
def brute(n):
r=1
for x in xrange(3<<(n-2),1<<n):
c=1
y=x
while 1:
y=((y&1)<<(n-1))|(y>>1)
if bin(x^y).count('1')!=n/2:
break
c+=1
if c>r:
r=c
X=x
return r,bin(X)[2:]
for n in xrange(4,32,4):
print n,heuristic(n)
ZGVmIGhldXJpc3RpYyhuKToKICAgIGlmIG4mMzoKICAgICAgICByZXR1cm4gMSwnMCcqbgogICAgICAgIAogICAgaWYgbj09NDoKICAgICAgICByZXR1cm4gNCwnMDAwMScKICAgIAogICAgZm9yIG9uZXMgaW4geHJhbmdlKDEsbi8yLTEpOgogICAgICAgIGRlZiByZWN1cnNlKGkseCxvbmVzbGVmdCk6CiAgICAgICAgICAgIGlmIG5vdCBvbmVzbGVmdDoKICAgICAgICAgICAgICAgIGI9KHg8PChuLzIpKSB8ICgoKDE8PChuLzIpKS0xKV54KQogICAgICAgICAgICAgICAgZm9yIGZsaXAgaW4geHJhbmdlKG4vMik6CiAgICAgICAgICAgICAgICAgICAgeD15PWJeKDE8PGZsaXApCiAgICAgICAgICAgICAgICAgICAgbT0xCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgMToKICAgICAgICAgICAgICAgICAgICAgICAgeT0oKHkmMSk8PChuLTEpKXwoeT4+MSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgYmluKHheeSkuY291bnQoJzEnKSE9bi8yOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICAgICAgbSs9MQogICAgICAgICAgICAgICAgICAgIGlmIG09PW4vMjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0sYmluKCgxPDxuKXx4KVszOl0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAKICAgICAgICAgICAgZm9yIGogaW4geHJhbmdlKGksbi8yLW9uZXNsZWZ0KToKICAgICAgICAgICAgICAgIHI9cmVjdXJzZShqKzEseHwoMTw8aiksb25lc2xlZnQtMSkKICAgICAgICAgICAgICAgIGlmIHI6IHJldHVybiByCiAgICAgICAgCiAgICAgICAgcj1yZWN1cnNlKDAsMCxvbmVzKQogICAgICAgIGlmIHI6IHJldHVybiByCiAgICAKICAgIHByaW50ICdmYWlsZWQnCiAgICAxLzAKCmRlZiBicnV0ZShuKToKICAgIHI9MQogICAgZm9yIHggaW4geHJhbmdlKDM8PChuLTIpLDE8PG4pOgogICAgICAgIGM9MQogICAgICAgIHk9eAogICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgIHk9KCh5JjEpPDwobi0xKSl8KHk+PjEpCiAgICAgICAgICAgIGlmIGJpbih4XnkpLmNvdW50KCcxJykhPW4vMjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGMrPTEKICAgICAgICBpZiBjPnI6CiAgICAgICAgICAgIHI9YwogICAgICAgICAgICBYPXgKICAgIHJldHVybiByLGJpbihYKVsyOl0KCmZvciBuIGluIHhyYW5nZSg0LDMyLDQpOgogICAgcHJpbnQgbixoZXVyaXN0aWMobik=
4 (4, '0001')
8 (4, '00011010')
12 (6, '000010111001')
16 (8, '0000010011101011')
20 (10, '00001000101111001101')
24 (12, '000001001000111010110111')
28 (14, '0001010000010011101001111011')