#!/usr/bin/python#A289670(和A284116)将位串映射到新的位串:#如果它以“0”开头,则追加“00”并删除前三位。#如果它以“1”开头,则追加“1101”并删除前三位。#这意味着位于(零诱导)位置1、2、4、5、7、8…的位,。。。#(非3的倍数)不会影响任何东西。#这些是不重要的部分。#位字符串的一个明显表示是一个长整数,但只有一个#还需要一个长度:可能有前导零。#只需存储重要位。#反转位串很好:可以测试_last_位#很容易,而且可以通过移位删除最重要的位。#顺便说一句,Python认为(1234L,12)和(1234,12)是相等的,即使设置为#元素。我们不必担心普通整数与长整数的比较。导入系统#位字符串表示:#(重要位、重要位数量、(所有)位数量mod 3)定义更新(bitstr):bimp=位字符串[0]bimplen=位字符串[1]blenmod3=位字符串[2]如果(bimp&1)==0:#预发送00,移位3(缩短1)如果blenmod3==0:blenmod3=2elif blenmod3==1:blenmod3=0双联-=1其他:blenmod3=1其他:#预弯反转1101,移位3(延长1)如果blenmod3==0:bimp+=3<<bimplen#1_01_1_blenmod3=1双膜+=1elif blenmod3==1:#bimp未更改#1_0_ 11blenmod3=2其他:bimp+=1<<bimplen#10_1_1blenmod3=0返回(bimp>>1,bimplen,blenmod3)如果长度(sys.argv)!=2:打印“用法:”,sys.argv[0],“长度”系统出口(1)大小=int(sys.argv[1])sizemod3=大小%3重要=(大小+2)/3toEmptySet=设置([(0,0,0)])toEmptyQuan=1#zero始终映射为空对于范围内的位(1,1<<重要):reachedSet=set()bitstr=(位,重要,sizemod3)为True时:如果reachedSet中的bitstr:break#找到了一个循环,而不是空的位字符串如果将bitstr输入到EmptySet:toEmptySet=toEmptySet.union(reachedSet)到清空数量+=1打破reachedSet.add(位字符串)bitstr=更新(bitstr)#打印位,“已到达”,bitstr打印尺寸,至清空数量<<(尺寸-重要)#乘以2^(相邻位数)---程序结束---