https://coderun.yandex.ru/problem/ambulance/description Средняя

Решение

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.lang.Long.max

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

    val line = reader.readLine().split(" ")
    val k1 = line[0].toLong()
    val m = line[1].toLong()
    val k2 = line[2].toLong()
    val p2 = line[3].toLong()
    val n2 = line[4].toLong()

    if (n2 > m) {
        writer.write("-1 -1")
        writer.newLine()
        reader.close()
        writer.close()
        return
    }
    if (k2 == 1L && (p2 != 1L || n2 != 1L)) {
         writer.write("-1 -1")
         writer.newLine()
         reader.close()
         writer.close()
         return
    }
    val minFlatPossible = (p2 - 1L) * m + (n2 - 1L) + 1L
    if (k2 < minFlatPossible) {
         writer.write("-1 -1")
         writer.newLine()
         reader.close()
         writer.close()
         return
    }

    if (m == 1L && p2 == 1L && n2 == 1L) {
        val resultP1 = if (k1 <= k2) 1L else 0L
        writer.write("$resultP1 1")
        writer.newLine()
        reader.close()
        writer.close()
        return
    }

    val possibleP1 = mutableSetOf<Long>()
    val possibleN1 = mutableSetOf<Long>()
    var validCFound = false

    val iterationLimit = 100001L
    for (c in 1L..iterationLimit) {
        val flatsPerEntrance = m * c
        if (flatsPerEntrance <= 0L) continue

        val p2Check = (k2 - 1L) / flatsPerEntrance + 1L
        val flatIndexInP2 = (k2 - 1L) % flatsPerEntrance
        val n2Check = flatIndexInP2 / c + 1L

        if (p2Check == p2 && n2Check == n2) {
            validCFound = true

            val p1Calc = (k1 - 1L) / flatsPerEntrance + 1L
            val flatIndexInP1 = (k1 - 1L) % flatsPerEntrance
            val n1Calc = flatIndexInP1 / c + 1L

            if (n1Calc > m) continue
            if (k1 == 1L && (p1Calc != 1L || n1Calc != 1L)) continue

            possibleP1.add(p1Calc)
            possibleN1.add(n1Calc)
        }
    }

    when {
        !validCFound -> writer.write("-1 -1")
        possibleP1.isEmpty() || possibleN1.isEmpty() -> writer.write("-1 -1")
        else -> {
            val resultP1 = if (possibleP1.size == 1) possibleP1.first() else 0L
            val resultN1 = if (possibleN1.size == 1) possibleN1.first() else 0L
            writer.write("$resultP1 $resultN1")
        }
    }
    writer.newLine()

    reader.close()
    writer.close()
}