fun main() { val t = readLine()!!.toInt() for (i in 1..t) { print("Case #$i: ") solve() } } fun solve() { val (w, n, d) = readLine()!!.split(' ').map(String::toInt) val x = readLine()!!.split(' ').map { it.toLong() - 1 }.toLongArray() val (xx, yy, gcd) = gcd(d.toLong(), n.toLong()) fun calc(ab: Long): Long { // dx + yn = ab val dd = ab / gcd var xxx = (xx * dd) % (n / gcd) if (xxx < 0) xxx += n / gcd return minOf(xxx, -(xxx - n / gcd)) } val ab = (0 until w / 2).map { x[it] - x[w - it - 1] } if (ab.any { it % gcd != 0L }) println("IMPOSSIBLE") else println(ab.sumOf { calc(it) }) } fun gcd(a: Long, b: Long): Triple { var x0 = 1L var y0 = 0L var x1 = 0L var y1 = 1L var aa = a var bb = b while (bb != 0L) { val d = aa / bb val nb = aa - d * bb val nx1 = x0 - d * x1 val ny1 = y0 - d * y1 aa = bb x0 = x1 y0 = y1 bb = nb x1 = nx1 y1 = ny1 } return Triple(x0, y0, aa) }