bzoj#P3557. [Ctsc2014] 随机数

[Ctsc2014] 随机数

题目描述

露露、花花和萱萱最近对计算机中的随机数产生了兴趣。为大家所熟知的是,有计算机生成的随机数序列并非真正的随机数, 而是由一定法则生成的伪随机数。  某一天,露露了解了一种生成随机数的方法,成为Mersenne twister。给定初始参数m∈Z+,x∈Z+∩[0,2m)和初值M0∈Z+∩[0,2m), 它通过下列递推式构造伪随机数列{Mn}:   其中XOR是二进制异或运算(C/C++中的^运算)。而参数x的选取若使得该数列在长度趋于无穷时,近似等概率地在Z+∩(0,2m)中取值, 就称x为好的。例如,在m>1时x=0就显然不是好的。  在露露向伙伴们介绍了Mersenne twister之后,花花想用这一些经典的随机性测试来检验它的随机性强度。为此,花花使用计算机计算 了一些Mk。  但细心的萱萱注意到,花花在某次使用二进制输入k时,在末尾多输入了l个0,。她正想告诉花花这个疏忽,然而花花已经计算并记录了 错误的Mk而没有记录k的值。虽然这其实不是什么致命的问题,但是在萱萱告诉花花她这个疏漏时,作为完美主义者的花花还是恳求萱萱 帮她修正Mk的值。萱萱便把这个任务交给了她的AI——你。

输入格式

第一行包含一个正整数m,  第二行为二进制表示的x(共m个数,从低位到高位排列)  第三行为二进制表示的M0(排列方式同x),  第四行包含一个整数type。  接下来分为两种可能的情况:  1.type=0(萱萱记下了花花的输入):则第五行包含一个整数,表示萱萱记下来的正确的k值。  2.type=1(萱萱未能记下花花的输入):则第五行为l,第六行输入花花计算出错误的二进制表示的Mk。

输出格式

仅一行,为m位的01串,表示你求得的正确Mk(同样要求从低位到高位)。

10
1 1 1 0 0 1 1 1 0 0 
1 1 1 0 0 0 0 0 1 1 
0
100

0101111001

提示

M<=1000000  K<=10^6

题目来源

没有写明来源