#P1445. Random number

Random number

本题没有可用的提交语言。

描述 一个黑盒算法假定自然数序列u(1),u(2),,u(N)u(1), u(2), \ldots, u(N)按非降序排列,NMN \leq M,并且对于每个pp1pN1 \leq p \leq N),不等式pu(p)Mp \leq u(p) \leq M均成立。

在对该算法进行测试时,我们遇到了以下问题。对于设置一个随机序列{u(i)}\{u(i)\},通常的随机数据生成器并不适用。由于该序列本身受到了某些限制,在(由限制条件所定义的区间内)选择下一个随机元素的方法并不能从整体上得到一个随机序列。

我们得出结论,这个问题可以用以下方式解决。如果我们按照某种特定顺序(例如,字典序)排列所有可能的序列,并给每个序列分配一个编号,那么在选择一个随机数之后,就可以将对应的序列当作随机序列。乍一看,似乎编写一个程序来按照这样的顺序生成所有这些序列就足够了。哎呀!即使MMNN的值不是很大,任何一台功能强大的现代计算机要列举出所有这样的序列也得花费几个世纪的时间。结果表明,如果我们能够根据其编号直接创建所需的序列,就可以避免生成所有的序列。但即便如此,这还不够全面。由于序列的数量相当大,编号可能是一个很长的数,由数百个十进制数字组成,然而我们的随机数据生成器只能给出普通的数字。我们决定从一个在[0,1][0,1]区间上分布的真正随机数生成一个长的随机数。具体来说,将这个数用二进制表示:0.b(1)b(2)0.b(1)b(2)\ldots,其中所有的b(i)=0b(i) = 011。让我们设定一个规则,将这样的实数与[A,B][A,B]区间内的一个整数相关联:

公式1:

在这里,我们假定ABA \leq Bp0p \geq 0,并且“div 2”是除以2的整数除法。

给定MMNN1NM2001 \leq N \leq M \leq 200)以及一个二进制实数0.b(1)b(2)b(p)0.b(1)b(2)\ldots b(p)1p4001 \leq p \leq 400)。编写一个程序来找出对应的u(1),u(2),,u(N)u(1), u(2), \ldots, u(N)序列,也就是说,在给定的MMNN条件下,在所有可能的{u(i)}\{u(i)\}序列的字典序中,找到编号为G(1,T,0.b(1)b(2)b(p))G(1,T,0.b(1)b(2)\ldots b(p))的序列(TT是这样的序列的数量)。编号从1开始。请记住,在字典序中,如果在省略相等的起始部分之后,序列{l(i)}\{l(i)\}尾部的第一个数字小于序列{h(i)}\{h(i)\}尾部的第一个数字,那么序列{l(i)}\{l(i)\}排在序列{h(i)}\{h(i)\}之前。下面的例子说明了当M=4M = 4N=3N = 3时,所有可能的序列在字典序下的列表。

注释(这与本题的解法无关):

如果我们使用上述公式,选择随机二进制向量0.b(1)b(2)b(p)0.b(1)b(2)\ldots b(p)并不能得到一个绝对均匀的随机数据生成器。然而,考虑到[A,B][A,B]区间很大这一事实,我们将得到一个在大多数情况下都适用的分布。

示例

1, 2, 3

1, 2, 4

1, 3, 3

1, 3, 4

1, 4, 4

2, 2, 3

2, 2, 4

2, 3, 3

2, 3, 4

2, 4, 4

3, 3, 3

3, 3, 4

3, 4, 4

4, 4, 4

(这里T=14T = 14

输入 输入的第一行包含MMNN。第二行包含二进制实数0.b(1)b(2)b(p)0.b(1)b(2)\ldots b(p)(无前导空格、尾随空格及其他空格)。

输出 将对应的序列u(1),u(2),,u(N)u(1), u(2), \ldots, u(N)写入输出。序列中的数字应该用一个空格分隔。

输入数据 1

4 3

0.01101101011110010001101010001011010

输出数据 1

2 2 4

提示

注释(这与本题的解法无关):

如果我们使用公式1,选择随机二进制向量0.b(1)b(2)b(p)0.b(1)b(2)\ldots b(p)并不能得到一个绝对均匀的随机数据生成器。然而,考虑到[A,B][A,B]区间很大这一事实,我们将得到一个在大多数情况下都适用的分布。

来源

1996年东北欧竞赛