UOJ Logo Universal Online Judge

UOJ

#6. 【NOI2014】随机数生成器

附件下载 统计

小H最近在研究随机算法。随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来获得随机性。事实上,随机数生成函数也并不是真正的“随机”,其一般都是利用某个算法计算得来的。

比如,下面这个二次多项式递推算法就是一个常用算法:

算法选定非负整数x0,a,b,c,d作为随机种子,并采用如下递推公式进行计算。

对于任意i1,xi=(axi12+bxi1+c)modd

这样可以得到一个任意长度的非负整数数列{xi}i1,一般来说,我们认为这个数列是随机的。

利用随机序列{xi}i1,我们还可以采用如下算法来产生一个1K随机排列{Ti}i=1K

  1. 初始设T1K的递增序列;
  2. T进行K次交换,第i次交换,交换TiT(ximodi)+1 的值。

此外,小H在这K次交换的基础上,又额外进行了Q次交换操作,对于第i次额外交换,小H会选定两个下标uivi,并交换TuiTvi的值。

为了检验这个随机排列生成算法的实用性,小H设计了如下问题:

小H有一个NM列的棋盘,她首先按照上述过程,通过N×M+Q次交换操作,生成了一个 1N×M的随机排列{Ti}i=1N×M然后将这N×M个数逐行逐列依次填入这个棋盘:也就是第 i 行第 j 列的格子上所填入的数应为T(i1)×M+j

接着小H希望从棋盘的左上角,也就是第一行第一列的格子出发,每次向右走或者向下走,在不走出棋盘的前提下,走到棋盘的右下角,也就是第N行第M列的格子。

小H把所经过格子上的数字都记录了下来,并从小到大排序,这样,对于任何一条合法的移动路径,小H都可以得到一个长度为N+M1的升序序列,我们称之为路径序列

小H想知道,她可能得到的字典序最小路径序列应该是怎样的呢?

输入格式

输入文件的第1行包含5个整数,依次为x0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子。

第2行包含三个整数 N,M,Q ,表示小H希望生成一个1N×M的排列来填入她NM列的棋盘,并且小H在初始的N×M次交换操作后,又进行了Q次额外的交换操作。

接下来Q行,第i行包含两个整数ui,vi,表示第i次额外交换操作将交换 TuiTvi的值

输出格式

输出一行,包含 N+M1 个由空格隔开的正整数,表示可以得到的字典序最小的路径序列。

样例一

input

1 3 5 1 71
3 4 3
1 7
9 9
4 9

output

1 2 6 8 9 12

explanation

根据输入的随机种子,小H所得到的前12个随机数xi为:

9 5 30 11 64 42 36 22 1 9 5 30

根据这12个随机数,小H在进行初始的12次交换操作后得到的排列为:

6 9 1 4 5 11 12 2 7 10 3 8

在进行额外的3次交换操作之后,小H得到的最终的随机排列为:

12 9 1 7 5 11 6 2 4 10 3 8

这个随机排列可以得到下面的棋盘:

12917
51162
41038

最优路径依次经过的数字为

1291628

样例二

input

654321 209 111 23 70000001
10 10 0

output

1 3 7 10 14 15 16 21 23 30 44 52 55 70 72 88 94 95 97

样例三

input

123456 137 701 101 10000007
20 20 0

output

1 10 12 14 16 26 32 38 44 46 61 81 84 101 126 128 135 140 152 156 201 206 237 242 243 253 259 269 278 279 291 298 338 345 347 352 354 383 395

样例四

见样例数据下载

限制与约定

测试点编号N,M的规模Q的规模约定
12N,M8Q=00a300
0b,c108
0x0<d108
1ui,viN×M
22N,M200
3
42N,M20000Q50000
5
6
72N,M5000
8
9
10

时间限制:5s

空间限制:256MB

本题的空间限制是256MB,请务必保证提交的代码运行时所使用的总内存空间不超过此限制。

一个32位整数(例如C/C++中的int和Pascal中的Longint)为4字节,因而如果在程序中声明一个长度为1024×1024的32位整型变量的数组,将会占用4MB的内存空间。

下载

样例数据下载