class Entry( ) :
def __init__ ( self ) :
self .M = ''
self .lf , self .uf = False , False
self .idx = 0
def nexts( self , bit, lf= None , uf= None ) :
""" Generate next Entry (idx+=1). If you need to set lf or uf, just
give it as argument."""
r = Entry( )
r.M = self .M + bit
r.lf = self .lf if lf== None else lf
r.uf = self .uf if uf== None else uf
r.idx = self .idx + 1
return r
def get( self , length) :
""" Return the M filled with 1 so that len(M)==length. """
return '{1:1<{0}}' .format ( length, self .M )
def __repr__ ( self ) :
""" for debug. """
return 'Entry(M=%s, idx=%s, uf=%s ,lf=%s)' %(
repr ( self .M ) , self .idx , self .uf , self .lf )
def main( U, L, N) :
# translate U L to binary string.
ub = bin( U) [ 2 :]
lb = bin( L) [ 2 :]
# let len(lb) == len(ub), filled with 0.
length = len ( ub)
lb = '{1:0>{0}}' .format ( length, lb)
queue = [ Entry( ) ] # start from (M='', idx=0, uf=False, lf=False)
candidates = [ ] # all candidates.
cnt = 0 # while counter, for test efficiency.
while queue: # do while the queue is not empty.
cnt += 1
now = queue.pop ( 0 )
# if both uf lf are set, we get a candidate.
if now.uf and now.lf :
candidates.append ( now.get ( length) )
continue
# if length is too large, this path is failed.
if now.idx >= length: continue
# 4 conditions.
if ub[ now.idx ] + lb[ now.idx ] == '10' :
queue.append ( now.nexts ( '1' , lf= True ) )
queue.append ( now.nexts ( '0' , uf= True ) )
elif ub[ now.idx ] + lb[ now.idx ] == '01' :
if now.lf : queue.append ( now.nexts ( '0' ) )
elif now.uf : queue.append ( now.nexts ( '1' ) )
else : pass # cut
elif ub[ now.idx ] + lb[ now.idx ] == '00' :
if not now.uf : queue.append ( now.nexts ( '0' ) )
else : queue.append ( now.nexts ( '1' , lf= True ) )
elif ub[ now.idx ] + lb[ now.idx ] == '11' :
if not now.lf : queue.qppend ( now.nexts ( '1' ) )
else :
queue.append ( now.nexts ( '0' , uf= True ) )
queue.append ( now.nexts ( '1' ) )
print candidates
print 'len of candidates =' , len ( candidates)
print 'cnt =' , cnt
print '-' *50
ans = max ( ( int ( c, 2 ) | N, c) for c in candidates)
print 'when M = %s(%s) has max.' %( ans[ 1 ] , int ( ans[ 1 ] , 2 ) )
print 'M | N =' , ans[ 0 ]
if __name__== '__main__' :
main( int ( raw_input ( 'U=' ) ) , int ( raw_input ( 'L=' ) ) , int ( raw_input ( 'N=' ) ) )
CmNsYXNzIEVudHJ5KCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5NID0gJycKICAgICAgICBzZWxmLmxmLCBzZWxmLnVmID0gRmFsc2UsIEZhbHNlCiAgICAgICAgc2VsZi5pZHggPSAwCgogICAgZGVmIG5leHRzKHNlbGYsIGJpdCwgbGY9Tm9uZSwgdWY9Tm9uZSk6CiAgICAgICAgIiIiIEdlbmVyYXRlIG5leHQgRW50cnkgKGlkeCs9MSkuIElmIHlvdSBuZWVkIHRvIHNldCBsZiBvciB1ZiwganVzdAogICAgICAgIGdpdmUgaXQgYXMgYXJndW1lbnQuIiIiCiAgICAgICAgciA9IEVudHJ5KCkKICAgICAgICByLk0gPSBzZWxmLk0gKyBiaXQKICAgICAgICByLmxmID0gc2VsZi5sZiBpZiBsZj09Tm9uZSBlbHNlIGxmCiAgICAgICAgci51ZiA9IHNlbGYudWYgaWYgdWY9PU5vbmUgZWxzZSB1ZgogICAgICAgIHIuaWR4ID0gc2VsZi5pZHggKyAxCiAgICAgICAgcmV0dXJuIHIKCiAgICBkZWYgZ2V0KHNlbGYsIGxlbmd0aCk6CiAgICAgICAgIiIiIFJldHVybiB0aGUgTSBmaWxsZWQgd2l0aCAxIHNvIHRoYXQgbGVuKE0pPT1sZW5ndGguICIiIgogICAgICAgIHJldHVybiAnezE6MTx7MH19Jy5mb3JtYXQobGVuZ3RoLCBzZWxmLk0pCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICIiIiBmb3IgZGVidWcuICIiIgogICAgICAgIHJldHVybiAnRW50cnkoTT0lcywgaWR4PSVzLCB1Zj0lcyAsbGY9JXMpJyUoCiAgICAgICAgICAgIHJlcHIoc2VsZi5NKSwgc2VsZi5pZHgsIHNlbGYudWYsIHNlbGYubGYpCgoKZGVmIG1haW4oVSwgTCwgTik6CgogICAgIyB0cmFuc2xhdGUgVSBMIHRvIGJpbmFyeSBzdHJpbmcuCiAgICB1YiA9IGJpbihVKVsyOl0KICAgIGxiID0gYmluKEwpWzI6XQoKICAgICMgbGV0IGxlbihsYikgPT0gbGVuKHViKSwgZmlsbGVkIHdpdGggMC4KICAgIGxlbmd0aCA9IGxlbih1YikKICAgIGxiID0gJ3sxOjA+ezB9fScuZm9ybWF0KGxlbmd0aCwgbGIpCgogICAgcXVldWUgPSBbRW50cnkoKV0gICAjIHN0YXJ0IGZyb20gKE09JycsIGlkeD0wLCB1Zj1GYWxzZSwgbGY9RmFsc2UpCiAgICBjYW5kaWRhdGVzID0gW10gICAgICMgYWxsIGNhbmRpZGF0ZXMuCiAgICBjbnQgPSAwICAgICAgICAgICAgICMgd2hpbGUgY291bnRlciwgZm9yIHRlc3QgZWZmaWNpZW5jeS4KCiAgICB3aGlsZSBxdWV1ZTogICAgICAgICMgZG8gd2hpbGUgdGhlIHF1ZXVlIGlzIG5vdCBlbXB0eS4KICAgICAgICBjbnQgKz0gMQogICAgICAgIG5vdyA9IHF1ZXVlLnBvcCgwKQoKICAgICAgICAjIGlmIGJvdGggdWYgbGYgYXJlIHNldCwgd2UgZ2V0IGEgY2FuZGlkYXRlLgogICAgICAgIGlmIG5vdy51ZiBhbmQgbm93LmxmOgogICAgICAgICAgICBjYW5kaWRhdGVzLmFwcGVuZChub3cuZ2V0KGxlbmd0aCkpCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgCiAgICAgICAgIyBpZiBsZW5ndGggaXMgdG9vIGxhcmdlLCB0aGlzIHBhdGggaXMgZmFpbGVkLgogICAgICAgIGlmIG5vdy5pZHggPj0gbGVuZ3RoOiBjb250aW51ZQogICAgICAgIAogICAgICAgICMgNCBjb25kaXRpb25zLgogICAgICAgIGlmICAgdWJbbm93LmlkeF0gKyBsYltub3cuaWR4XSA9PSAnMTAnOgogICAgICAgICAgICBxdWV1ZS5hcHBlbmQobm93Lm5leHRzKCcxJywgbGY9VHJ1ZSkpCiAgICAgICAgICAgIHF1ZXVlLmFwcGVuZChub3cubmV4dHMoJzAnLCB1Zj1UcnVlKSkKICAgICAgICAgICAgCiAgICAgICAgZWxpZiB1Yltub3cuaWR4XSArIGxiW25vdy5pZHhdID09ICcwMSc6CiAgICAgICAgICAgIGlmICAgbm93LmxmOiAgICBxdWV1ZS5hcHBlbmQobm93Lm5leHRzKCcwJykpCiAgICAgICAgICAgIGVsaWYgbm93LnVmOiAgICBxdWV1ZS5hcHBlbmQobm93Lm5leHRzKCcxJykpCiAgICAgICAgICAgIGVsc2U6ICAgICAgICAgICBwYXNzICAgICMgY3V0CiAgICAgICAgCiAgICAgICAgZWxpZiB1Yltub3cuaWR4XSArIGxiW25vdy5pZHhdID09ICcwMCc6CiAgICAgICAgICAgIGlmIG5vdCBub3cudWY6ICBxdWV1ZS5hcHBlbmQobm93Lm5leHRzKCcwJykpCiAgICAgICAgICAgIGVsc2U6ICAgICAgICAgICBxdWV1ZS5hcHBlbmQobm93Lm5leHRzKCcxJywgbGY9VHJ1ZSkpCiAgICAgICAgCiAgICAgICAgZWxpZiB1Yltub3cuaWR4XSArIGxiW25vdy5pZHhdID09ICcxMSc6CiAgICAgICAgICAgIGlmIG5vdCBub3cubGY6ICBxdWV1ZS5xcHBlbmQobm93Lm5leHRzKCcxJykpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBxdWV1ZS5hcHBlbmQobm93Lm5leHRzKCcwJywgdWY9VHJ1ZSkpCiAgICAgICAgICAgICAgICBxdWV1ZS5hcHBlbmQobm93Lm5leHRzKCcxJykpCiAgICAKICAgIHByaW50IGNhbmRpZGF0ZXMKICAgIHByaW50ICdsZW4gb2YgY2FuZGlkYXRlcyA9JywgbGVuKGNhbmRpZGF0ZXMpCiAgICBwcmludCAnY250ID0nLCBjbnQKICAgIHByaW50ICctJyo1MAogICAgCiAgICBhbnMgPSBtYXgoKGludChjLDIpIHwgTiwgYykgZm9yIGMgaW4gY2FuZGlkYXRlcykKICAgIHByaW50ICd3aGVuIE0gPSAlcyglcykgaGFzIG1heC4nJShhbnNbMV0sIGludChhbnNbMV0sMikpCiAgICBwcmludCAnTSB8IE4gPScsIGFuc1swXQogICAgCgppZiBfX25hbWVfXz09J19fbWFpbl9fJzoKICAgIG1haW4oaW50KHJhd19pbnB1dCgnVT0nKSksIGludChyYXdfaW5wdXQoJ0w9JykpLCBpbnQocmF3X2lucHV0KCdOPScpKSkKCQ==