#P14951. [uoi2016]小石子自动机

[uoi2016]小石子自动机

题目背景

卵石自动机「Marge-2016」运行在一个被划分成若干单元格的正方形表格上。任意时刻,每个单元格中都有若干个卵石,数量可以为 00

自动机接收两个自然数 AABB 作为输入:初始时,左上角单元格中有 AA 个卵石,右上角单元格中有 BB 个卵石,其余单元格中没有卵石。

每个单元格都附有一个函数。该函数接收当前这个单元格中的卵石数量,并返回四个数,分别表示下一次迭代时要从这个单元格搬到相邻的上、右、下、左四个单元格中的卵石数量。

每一轮迭代中,所有单元格会同时按照各自函数的返回值搬动卵石。如果某一轮迭代中没有任何卵石发生移动,则程序在这一轮后结束。自动机的输出是结束时左下角和右下角两个单元格中的卵石数量。结束时其余单元格中的卵石数量可以任意,评测时会忽略。

任务

本题共有 55 种子任务。输入第一行给出当前评测的子任务编号。

你需要为当前子任务构造一套单元格函数,使得对输入文件中给出的每组 (n,A,B)(n,A,B),自动机都能得到对应要求的输出。

五个子任务如下:

  1. 输出应为 (0,A+B)(0,A+B)。也就是说,左下角没有卵石,右下角有 A+BA+B 个卵石。
  2. 输出应为 (0,AB)(0,|A-B|)。也就是说,右下角有 AABB 差的绝对值个卵石,左下角没有卵石。
  3. 输出应为 (0,min(A,B))(0,\min(A,B))
  4. 输出应为 (0,max(A,B))(0,\max(A,B))
  5. A>BA>B,输出应为 (1,0)(1,0);若 A<BA<B,输出应为 (0,1)(0,1);若 A=BA=B,输出应为 (0,0)(0,0)。换句话说,较大数最初所在的一侧对应的底角处应留下 11 个卵石;若两数相等,则两个底角都不留下卵石。

Hydro 适配说明

原题是函数提交题,要求实现函数 automaton。为了在 Hydro OJ 上直接评测,本题改为普通程序输出格式。

你的程序需要读入当前测试文件,然后输出一整张「转移表」。评测器会读取这张转移表,并用它模拟自动机。

对于每个 size,row,column,pebblessize,row,column,pebbles,你需要输出四个整数:

top right bottom left

含义分别是:当表格大小为 size,当前单元格位于第 row 行第 column 列,且其中有 pebbles 个卵石时,下一轮要搬到上、右、下、左四个相邻单元格的卵石数量。

输出顺序必须严格为:

for size = 5..10:
  for row = 1..size:
    for column = 1..size:
      for pebbles = 1..200:
        输出 top right bottom left

因此总输出行数为

(52+62+72+82+92+102)×200=71000(5^2+6^2+7^2+8^2+9^2+10^2)\times 200=71000

行。

输入格式

第一行包含一个整数 subproblemsubproblem,表示当前子任务编号。

第二行包含一个整数 TT,表示测试组数。

接下来 TT 行,每行包含三个整数:

size A B

其中 size 是正方形表格的边长,AABB 是初始时左上角与右上角的卵石数量。

输出格式

按照上文规定的顺序输出 7100071000 行。

每行输出四个整数:

top right bottom left

这些数必须满足:

  • 四个数均为非负整数;
  • 四个数之和不能超过当前单元格中的卵石数量 pebbles
  • 不能把卵石搬出表格边界;
  • 对输入文件中的每一组测试数据,自动机必须在不超过 1000010000 次迭代后停止;
  • 停止后,左下角与右下角的卵石数量必须符合当前子任务要求。

约束条件

  • 5size105\le size\le 10
  • 1A,B1001\le A,B\le 100
  • 评测器在模拟过程中只会访问 pebbles11200200 的转移规则;
  • 自动机最多允许迭代 1000010000 次。

样例

样例输入

1
1
5 3 4

样例说明

这是第 11 个子任务,表格大小为 55,初始时左上角有 33 个卵石,右上角有 44 个卵石。

本组数据要求最终输出为 (0,7)(0,7),即左下角有 00 个卵石,右下角有 77 个卵石。

注意:本题的程序输出是一整张转移表,共 7100071000 行,因此题面中不展示完整样例输出。