// WITH_STDLIB // TARGET_BACKEND: JVM private const val MOD = 998244353 private fun mul(a: Int, b: Int) = (a.toLong() * b % MOD).toInt() fun box(): String { val n = 400 val d = Array(n) { IntArray(n) { Int.MAX_VALUE / 2 } } for (i in 0 until n) { d[i][i] = 0 } val m = n - 1 val g = Graph(n, 2 * m) repeat(m) { val a = it val b = it + 1 d[a][b] = 1 d[b][a] = 1 g.add(a, b) g.add(b, a) } for (k in 0 until n) { for (i in 0 until n) { for (j in 0 until n) { val s = d[i][k] + d[k][j] if (s < d[i][j]) d[i][j] = s } } } for (x in 0 until n) { val row = IntArray(n) { y -> var prod = 1 val dx = d[x] val xy = dx[y] for (k in 0 until n) if (k != x) { val dy = d[y] val xk = dx[k] val yk = dy[k] var cnt = 0 var cntMid = 0 g.from(k) { t -> val xt = dx[t] val yt = dy[t] if (xt == xk - 1) when (yt) { yk - 1 -> { cnt++ } yk + 1 -> { if (xk + yk == xy) { cntMid++ cnt++ } } } } if (cntMid > 1 || cnt == 0) { prod = 0 break } else { prod = mul(prod, cnt) } } prod } for (i in 0 until n) { if (row[i] != 1) throw AssertionError("x: $x; row[$i]: ${row[i]}") } } return "OK" } class Graph(vCap: Int = 16, eCap: Int = vCap * 2) { var vCnt = 0 var eCnt = 0 var vHead = IntArray(vCap) { -1 } var eVert = IntArray(eCap) var eNext = IntArray(eCap) fun add(v: Int, u: Int, e: Int = eCnt++) { ensureVCap(maxOf(v, u) + 1) ensureECap(e + 1) eVert[e] = u eNext[e] = vHead[v] vHead[v] = e } inline fun from(v: Int, action: (u: Int) -> Unit) { var e = vHead[v] while (e >= 0) { action(eVert[e]) e = eNext[e] } } private fun ensureVCap(vCap: Int) { if (vCap <= vCnt) return vCnt = vCap if (vCap > vHead.size) { val newSize = maxOf(2 * vHead.size, vCap) vHead = vHead.copyOf(newSize) } } private fun ensureECap(eCap: Int) { if (eCap <= eCnt) return eCnt = eCap if (eCap > eVert.size) { val newSize = maxOf(2 * eVert.size, eCap) eVert = eVert.copyOf(newSize) eNext = eNext.copyOf(newSize) } } }