# These are the characters we will use in generated strings
charset="abcdefghijklmnopqrstuvwxyz0123456789"
def numberToString(n):
base = len(charset)
# convert the number to base len(charset)
chars=[]
while n > 0:
chars.append(n%base)
n = n//base
while len(chars) < 3:
chars.append(0)
# whiten (make random-looking) by modifying each
# character with a hash of the others
hash = 23634562
for i in range(0,len(chars)):
# the char is reversibly affected by previous characters
chars[i] = (chars[i] + hash + (hash//256)) % base
hash = ((hash + chars[i])*31) % 1000000007
# do it again in the other direction
chars.reverse()
hash = 23634562
for i in range(0,len(chars)):
# the char is reversibly affected by previous characters
chars[i] = (chars[i] + hash + (hash//256)) % base
hash = ((hash + chars[i])*31) % 1000000007
# make the string
return str.join("", [charset[c] for c in chars])
for n in range(0,10):
print(numberToString(n))
for n in range(46650,46670):
print(numberToString(n))
# your code goes here
IyBUaGVzZSBhcmUgdGhlIGNoYXJhY3RlcnMgd2Ugd2lsbCB1c2UgaW4gZ2VuZXJhdGVkIHN0cmluZ3MKY2hhcnNldD0iYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IgoKZGVmIG51bWJlclRvU3RyaW5nKG4pOgogICAgYmFzZSA9IGxlbihjaGFyc2V0KQoKICAgICMgY29udmVydCB0aGUgbnVtYmVyIHRvIGJhc2UgbGVuKGNoYXJzZXQpCiAgICBjaGFycz1bXQogICAgd2hpbGUgbiA+IDA6CiAgICAgICAgY2hhcnMuYXBwZW5kKG4lYmFzZSkKICAgICAgICBuID0gbi8vYmFzZQogICAgd2hpbGUgbGVuKGNoYXJzKSA8IDM6CiAgICAgICAgY2hhcnMuYXBwZW5kKDApCgogICAgIyB3aGl0ZW4gKG1ha2UgcmFuZG9tLWxvb2tpbmcpIGJ5IG1vZGlmeWluZyBlYWNoCiAgICAjIGNoYXJhY3RlciB3aXRoIGEgaGFzaCBvZiB0aGUgb3RoZXJzCiAgICBoYXNoID0gMjM2MzQ1NjIKICAgIGZvciBpIGluIHJhbmdlKDAsbGVuKGNoYXJzKSk6CiAgICAgICAgIyB0aGUgY2hhciBpcyByZXZlcnNpYmx5IGFmZmVjdGVkIGJ5IHByZXZpb3VzIGNoYXJhY3RlcnMKICAgICAgICBjaGFyc1tpXSA9IChjaGFyc1tpXSArIGhhc2ggKyAoaGFzaC8vMjU2KSkgJSBiYXNlCiAgICAgICAgaGFzaCA9ICgoaGFzaCArIGNoYXJzW2ldKSozMSkgJSAxMDAwMDAwMDA3CgogICAgIyBkbyBpdCBhZ2FpbiBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uCiAgICBjaGFycy5yZXZlcnNlKCkKICAgIGhhc2ggPSAyMzYzNDU2MgogICAgZm9yIGkgaW4gcmFuZ2UoMCxsZW4oY2hhcnMpKToKICAgICAgICAjIHRoZSBjaGFyIGlzIHJldmVyc2libHkgYWZmZWN0ZWQgYnkgcHJldmlvdXMgY2hhcmFjdGVycwogICAgICAgIGNoYXJzW2ldID0gKGNoYXJzW2ldICsgaGFzaCArIChoYXNoLy8yNTYpKSAlIGJhc2UKICAgICAgICBoYXNoID0gKChoYXNoICsgY2hhcnNbaV0pKjMxKSAlIDEwMDAwMDAwMDcKICAgIAogICAgIyBtYWtlIHRoZSBzdHJpbmcKICAgIHJldHVybiBzdHIuam9pbigiIiwgW2NoYXJzZXRbY10gZm9yIGMgaW4gY2hhcnNdKQoKZm9yIG4gaW4gcmFuZ2UoMCwxMCk6CiAgICBwcmludChudW1iZXJUb1N0cmluZyhuKSkKCmZvciBuIGluIHJhbmdlKDQ2NjUwLDQ2NjcwKToKICAgIHByaW50KG51bWJlclRvU3RyaW5nKG4pKQojIHlvdXIgY29kZSBnb2VzIGhlcmU=