private fun readInts() = readln().split(" ").map { it.toInt() }.toIntArray() fun main() { val (n, k) = readInts() val a = Array(n) { _ -> readInts() } val b = Array(n) { _ -> readInts() } val ans = solve(n, k, a, b); println("${ans.count()}") ans.forEach { op -> if (op < n) { println("C ${op+1}") } else { println("R ${op+1-n}") } } } fun solve(n: Int, k: Int, a: Array, b: Array): IntArray { val ops = IntArray(k) search(b, k, a, ops) ops.reverse() val ans = mutableListOf() ops.forEach { op -> val p = if (op < n) selectCol(a,op) else selectRow(a,op-n) if (op < n) { reorderColsByColPerm(a, op) } else { reorderRowsByRowPerm(a, op-n) } val tmp = mutableListOf() val cnt = cycle(p) - 1 var z = op % n for (i in 1..cnt) { z = p[z]-1 tmp.add(if (op < n) z else (z+n)) } ans.addAll(0, tmp) } return ans.toIntArray() } fun search(b: Array, k: Int, t: Array, v: IntArray): Boolean { if (k === 0) { return t.contentDeepEquals(b) } for (i in b.indices) { v[k-1] = i val s1 = Array(t.count()) { e -> t[e].copyOf() } reorderColsByColPerm(s1, i) if (search(b, k-1, s1, v)) { return true } v[k-1] = i + b.count() val s2 = Array(t.count()) { e -> t[e].copyOf() } reorderRowsByRowPerm(s2, i) if (search(b, k-1, s2, v)) { return true } } return false } fun cycle(p: IntArray): Int { var t = p.copyOf() var w = p.copyOf() var cnt = 0 while (true) { cnt++ for (i in p.indices) { t[ p[i]-1 ] = w[i] } if (p.contentEquals(t)) { return cnt } w = t.copyOf() } } fun reorderColsByColPerm(s: Array, x: Int) { val t = Array(s.count()) { i -> s[i].copyOf() } for (r in t.indices) { for (c in t.indices) { s[ r ][ t[c][x]-1 ] = t[r][c] } } } fun reorderRowsByRowPerm(s: Array, y: Int) { val t = Array(s.count()) { i -> s[i].copyOf() } for (r in t.indices) { for (c in t.indices) { s[ t[y][r]-1 ][ c ] = t[r][c] } } } fun selectCol(s: Array, x: Int): IntArray { return IntArray(s.count()) { r -> s[r][x] } } fun selectRow(s: Array, y: Int): IntArray { return IntArray(s.count()) { c -> s[y][c] } }