存不下
时间限制:50s 空间限制:8MB
题目描述
I never said “640K should be enough for anybody!”.
Bill Gates
阿米巴是小强的好朋友。他经常和小强通过即时通讯工具聊天。但是,小强还是喜欢和阿米巴面对面的在一起的感觉,于是他想说服阿米巴放弃即时通讯工具。小强提出的一个理由是,别人可能偷看到他们两个人之间的相互说的“那些话”从而造出“大新闻”。阿米巴认为他们可以通过加密聊天来解决这个问题。小强和阿米巴都知道,只有一次一密这种真正安全的加密算法才能保护住他们的信息。这种加密方法虽然很安全,但是需要在事前约定很长的一个随机串。于是,小强又提出,他的u盘太小,根本存不下太多东西,一次无法从阿米巴那里拷贝足够长的随机串。为了减少事前约定的串的长度,阿米巴提出了一个“随机倍增器”。这个“随机倍增器”可以将一个N位的随机串变成一个2*N位的看起来也很随机的串。具体的,对于一个长度为N的01串,选取参数M,C,阿米巴用下面的方法把它变成一个长度为2N的串:
首先,令H为Mod(1371,2M),s=0
对于每个i从1到N,设输入的第i位是Xi,做下面几个事情:
s=Mod(RotL(Mod(3432918353*s+C,232),32)*461845907,232)
H=Xor(H,Xor(Mod(s,2M),Xi))
H=RotL(H,M)
H=Mod(H*5+3864292196,2M)
输出H的二进制位从低到高的第M位、第M-1位(例如,如果H=13(二进制是1101),M=4,那么就是1和1)
在这里,Mod表示取模,即,Mod(a,b)为一个0~b-1之间的整数,表示a模b的余数。RotL(a,b)表示从一次b位的循环左移,即,将a的所有二进制位向更高位移动一位,原来的第b位移动回第1位。(比如,RotL(13,4)=11,因为13的二进制是1101,循环左移变成1011,就是11)
小强从这个算法的常数中一下就看出了这个算法改造自著名的MurmurHash3。不过,小强认为阿米巴连NOIP都没有考过,他改造出来的算法一定是有缺陷的。阿米巴偏偏不信这点。为了向阿米巴说明这个算法的“随机性”不是特别强,小强想精心构造一个输入串,使得输出串中0的个数特别多。我们知道,如果这个算法真的很随机,因为输入只有N位,所以输出中应该是不会有太多的0的。曾经获得过NOIP普及组二等奖的小强还是有一定的算法能力的,他很快就想出了一个构造的算法。但是,问题在于小强没有带笔记本,他只能用自己的手机上的浏览器运行javascript来进行计算。但是手机上的内存非常紧张,需要用的数组根本存不下!
为了小强和阿米巴在一起的美好时光,你要利用非常紧缺的内存来完成输入串的构造。
输入格式
输入一行,N,M,C
输出格式
第一行一个整数,表示输出串中1的个数的最小值。
然后,输出一行N个01,表示输入串。如果有多种可能的输入,你可以任选一个。
样例输入
3 3 5
样例输出
0 101
提示
对于100%的数据,1<=N<=5000,3<=M<=20,N*2M<=50000000,0<=C<2^31
题目来源
By 佚名提供