排序
题号:NC19827
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 1024 M,其他语言2048 M
64bit IO Format: %lld

题目描述

在海拉尔某处存在着写有0到2k-1(含)的整数的2k块石板排成一列,每个整数恰出现一次。你拥有三种魔法,交换魔法可以交换写有a和b的石板(a和b为固定数字,无法自选);异或魔法可以把每块石板上的数字异或你任选的一个1到2k-1之间的数字;加魔法可以把每块石板上的数字加上你任选的一个1到2k-1之间的数字,结果模2k
你的目的是将石板整理成升序(即0,1, ..., 2k-1)。三种魔法的使用顺序没有限制。

输入描述:

第一行一个整数2k(1≤ k≤ 10)。
第二行两个不同的整数a和b(0≤ a,b≤ 2k-1)。
第三行2k个整数,为一个0,1, ..., 2k-1的排列。

输出描述:

如果无法将石板整理成升序,只需输出一行-1。
否则在第一行输出一个整数表示整理所使用的魔法的总数。
接下来每行一个魔法,如果使用交换魔法,则输出0;如果使用异或魔法,则输出1 x,其中x为你指定的数字;如果使用加魔法,则输出2 x,其中x为你制定的数字。
使用的魔法数量必须为0到32768之间的整数,且按顺序使用过所有魔法后,石板必须被整理成升序。
示例1

输入

复制
2
0 1
1 0

输出

复制
5
2 1
2 1
0
2 1
2 1

备注:

可以证明如果能在有限步内完成1024块石板的整理的话,32768步已经够了。