好烦人啊,竟然要卡我最喜欢用的自然溢出,你知道的,OI Wiki真的很好用
首先对于base为偶数的情况,只要l够大(大于64)则一定会出现basel≡0(mod264)
然后对于base为奇数的情况,使用ThueMorse序列(一个01序列满足a0=0,n为偶数时an=a2n,n为奇数an=1−an−1)来构造
定义¬x是对01串x按位取反的结果
则对于ThueMorse序列s,s0=0,sn=sn−1+¬sn−1
对这两个做差得到
sn−¬sn=(sn−1×base2n−2+¬sn−1)(¬sn−1×base2n−2+sn−1)=(sn−1−¬sn−1)×(base2n−2−1)
进行换元fn=sn−¬sn,gn=base2n−2−1
所以fn=fn−1×gn,进一步得到fn=f1×∏i=2ngi
所以不难发现g一定是一个偶数
再简短一点的方式,平方差可得gn=base2n−2−1=(base2n−3−1)×(base2n−3+1)
后半部分一定是一个偶数对吧,满足了我们的条件
然后根据计算,只要n=12就可以卡掉自然溢出(详细证明过程见OI Wiki)
int n=1<<12, len=n>>1;
cout<<n<<" "<<len<<"\n";
for( int i=0;i<n;i++ ) cout<<char( 'a'+( __builtin_popcount( i ) & 1 ) );