题目描述
题目译自 Ukrainian Olympiads in Informatics 2019 Stage 4 Day1 T1. Двійкові маніпуляції
科扎克·武斯在信息学课程中总是遇到「二」的问题……不,不是因为他不擅长计算机。而是最近所有的作业都必须在一个特别喜欢 2 的幂的自动机上完成。
2 的幂是指形如 2x 的数字,其中 x 是一个非负整数。例如,1,2,4,8,16 是 2 的幂,而 3,7,10,15,19 则不是。
自动机操作一个长度为 n 的整数数组 a,其中 n 是 2 的幂。自动机唯一能做的操作是将第 t 个位置的数字移动到数组的开头,同时将从开头到该位置的所有数字向后移动一位。例如,如果 a=[1,2,3,4,5,6,7,8],将第 4 个元素移动到开头后,数组变为 a=[4,1,2,3,5,6,7,8]。请注意,自动机只能对 t 是 2 的幂的位置执行此操作。
武斯正全力完成他的最后一份家庭作业——对于给定的数组,编写一个序列 t1,t2,…,tk,将数组转换为非递减排序的数组。他已经取得了一些进展,但他请求你也完成同样的任务,以便核对答案。请帮助他找到这样的序列!
输入格式
第一行包含两个整数 n 和 g (2≤n≤128,0≤g≤6),分别表示数组长度和子任务编号。保证 n 是 2 的幂。
第二行包含 n 个整数 a1,a2,…,an (1≤ai≤n),表示数组的元素。
输出格式
第一行输出一个整数 k (0≤k≤16384),表示命令的数量。
第二行输出 k 个整数 t1,t2,…,tk (1≤ti≤n),表示排序数组的命令序列。这样的序列可能有多个,因此输出任意一个(不必是最短的)。
4 0
4 3 2 1
4
2 4 4 2
在第一个样例中,数组初始为 [4,3,2,1]。将第 2 个元素移动到开头后,数组变为 [3,4,2,1]。然后两次将最后一个元素移动到开头,第一次得到 [1,3,4,2],第二次得到 [2,1,3,4]。最后一步将第 2 个元素移动到开头,得到 [1,2,3,4],这是一个非递减排序的数组。
4 0
1 3 1 2
8
2 4 2 2 4 4 2 2
在第二个样例中,数组初始为 [1,3,1,2]。将第 4 个元素移动到开头后,数组变为 [2,1,3,1]。然后将第 2 个元素移动到开头,得到 [1,2,3,1]。最后将最后一个元素移动到开头,得到 [1,1,3,2],这是一个有序数组。
数据范围与提示
详细子任务附加限制及分值如下表所示:
| 子任务 |
分值 |
附加限制 |
| 1 |
11 |
n=2;所有数字不同 |
| 2 |
15 |
n=4;所有数字不同 |
| 3 |
20 |
n=8;所有数字不同 |
| 4 |
22 |
数组中恰好有 2n 个数字为 1,其余为 2 |
| 5 |
23 |
所有数字不同 |
| 6 |
9 |
无附加限制 |