#1563. [IOI2014]gondola缆车
[IOI2014]gondola缆车
Description
猫空缆车(Mao-Kong Gondola)是台北市的一个著名景点。这个缆车系统包括一个环形轨道、一个缆车站和n个编号为1到n的缆车。这些缆车以固定的方向在轨道上循环运行。在缆车 经过缆车站之后,下一个经过缆车站的缆车将会是i+1(i<n时),或者是缆车1(i=n时)。 缆车可能会发生故障。幸运的是,我们有无限多个后备的空闲缆车,其编号依次为n+1,n+2等等。当某个缆车发生故障时,我们会在轨道上的同一位置用最前一个空闲缆车替换它,也就是说,编号最小的空闲缆车。举个例子,如果当前有五辆缆车而缆车1发生了故障,那么我们将用缆车6来替换它。 你喜欢去缆车站上观察缆车过站。一个缆车序列( gondola sequence ) 是由缆车过站次序形成的n个缆车编号的序列。在你到达缆车站之前,有可能会有一到多个缆车发生故障(并且被替换掉),但是在你观察过程中是不会有缆车发生故障的。 注意,在轨道上的相同一组缆车,有可能给出多种缆车序列,这取决于当你到缆车站时哪辆缆车最先过站。举个例子,如果没有任何缆车发生故障,那么(2, 3, 4, 5, 1)和(4, 5, 1, 2, 3)都可能是缆车序列,但是(4, 3, 2, 5, 1)不可能是(因为缆车的次序有误)。 如果缆车1发生故障,那么我们可能会观察到缆车序列(4, 5, 6, 2, 3)。如果接着缆车4发生故障而我们用缆车7替换它,就有可能会观察到缆车序列(6, 2, 3, 7, 5)。如果缆车7在此后发生故障而我们用缆车8替换它,那么现在就有可能会观察到缆车序列(3, 8, 5, 6, 2)。
一个 替换序列( replacement sequence ) 是一个由故障缆车编号组成的序列,其次序与故障发生次序相同。在前面的例子中,替换序列是(1, 4, 7)。如果一个替换序列 对应的故障发生后,我们由此有可能观察到缆车序列 ,就称替换序列 生成缆车序列。 缆车序列检查 在前三个子任务中,你必须检查某个输入序列是否是一个缆车序列。下表举例说明了哪些序列是缆车序列而哪些不是。 输出一行一个整数0或1,当输入序列是一个缆车序列时,输出1,否则输出0。 替换序列 在接下来的三个子任务中,你必须构造一个能够生成给定缆车序列的可能的替换序列。满足条件的任意替换序列都可以。 输出一行,第一个整数l表示替换序列的长度,后面l个整数,第i个表示replacementSeq[i]。 replacementSeq: 一个足够大的能存下替换序列的数组;你应当将替换序列中的 第i个元素存放到replacementSeq[i]做为返回结果,这里0≤i≤l-1。 替换序列计数 在接下来的四个子任务中,你必须计算所有能够生成给定序列(有可能是缆车序列,也有可能不是)的可能替换序列的数目,并将其对1,000,000,009取模。 如果输入序列是一个缆车序列,则计算能够生成该缆车序列的可能的替换序列的 数目(有可能会非常大), 然后输出将该数值对 1,000,000,009 取模的结果。如果输入序列不是一个缆车序列,应输出0。如果输入序列是一个缆车序列, 但是没有缆车发生故障,应输出1。
Format
Input
第1行: T,你的程序需要解决的子任务编号(1≤T≤10)。 第2行: n,输入序列的长度。 第3行: 如果T是4、5或者6,此行包含gondolaSeq[0], ..., gondolaSeq[n-1]。否则此行包含inputSeq[0], ..., inputSeq[n-1]。
Output
输出格式见题目描述。
Samples
1
30
16 26 18 19 20 13 22 21 24 25 17 27 28 29 30 1 2 3 11 5 6 8 7 9 10 12 4 23 14 15
0