https://coderun.yandex.ru/problem/permutation-ya-intern Средняя

Решение

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.lang.IllegalArgumentException

fun longSqrt(n: Long): Long {
    if (n < 0) throw IllegalArgumentException("Нельзя извлечь корень из отрицательного числа")
    if (n == 0L) return 0L
    var low = 1L
    var high = 3_000_000_000L
    var ans = 0L
    while (low <= high) {
        val mid = low + (high - low) / 2
        if (mid == 0L || mid > Long.MAX_VALUE / mid) {
            high = mid - 1
            continue
        }
        val midSquared = mid * mid
        if (midSquared <= n) {
            ans = mid
            low = mid + 1
        } else {
            high = mid - 1
        }
    }
    return ans
}

fun main(args: Array<String>) {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))

    val n = reader.readLine().toLong()
    val nL = n

    val parts = reader.readLine().split(" ")
    val s1p = parts[0].toLong()
    val s2p = parts[1].toLong()
    val s3p = parts[2].toLong()

    val ts1 = nL * (nL + 1L) / 2L
    val ts2 = nL * (nL + 1L) * (2L * nL + 1L) / 6L
    val ts3 = ts1 * ts1

    val s1 = ts1 - s1p
    val s2 = ts2 - s2p
    val s3 = ts3 - s3p

    val e1 = s1
    val e2 = (s1 * s1 - s2) / 2L
    val e3 = (s1 * s1 * s1 - 3L * s1 * s2 + 2L * s3) / 6L

    for (xL in 1L..nL) {
        val xSquared = xL * xL
        val xCubed = xSquared * xL
        if (xCubed - e1 * xSquared + e2 * xL - e3 == 0L) {
            val sumYZ = e1 - xL
            val prodYZ = e2 - e1 * xL + xSquared
            val discriminant = sumYZ * sumYZ - 4L * prodYZ
            if (discriminant >= 0L) {
                val sqrtD = longSqrt(discriminant)
                if (sqrtD * sqrtD == discriminant) {
                    val yLongNum = sumYZ + sqrtD
                    val zLongNum = sumYZ - sqrtD
                    if (yLongNum % 2L == 0L && zLongNum % 2L == 0L) {
                        val yL = yLongNum / 2L
                        val zL = zLongNum / 2L
                        if (yL in 1L..nL && zL in 1L..nL) {
                            if (xL != yL && xL != zL && yL != zL) {
                                writer.write("$xL $yL $zL\\n")
                                reader.close()
                                writer.flush()
                                writer.close()
                                return
                            }
                        }
                    }
                }
            }
        }
    }

    reader.close()
    writer.flush()
    writer.close()
}