https://coderun.yandex.ru/problem/super-marathon Средняя

Решение

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

fun gcd(a: Long, b: Long): Long =
    if (b == 0L) a else gcd(b, a % b)

fun extGcd(a: Long, b: Long): LongArray {
    if (b == 0L) return longArrayOf(a, 1, 0)
    val res = extGcd(b, a % b)
    val g = res[0]
    val x1 = res[1]
    val y1 = res[2]
    val x = y1
    val y = x1 - (a / b) * y1
    return longArrayOf(g, x, y)
}

fun main() {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))

    val parseTime = { s: String ->
        val (hh, mm) = s.split(':')
        hh.toLong() * 60 + mm.toLong()
    }

    val startA = parseTime(reader.readLine().trim())
    val startB = parseTime(reader.readLine().trim())
    val periodA = parseTime(reader.readLine().trim())
    val periodB = parseTime(reader.readLine().trim())

    val g = gcd(periodA, periodB)
    val delta = startB - startA
    if (delta % g != 0L) {
        writer.write("Never\\n")
        writer.flush()
        return
    }

    val m1 = periodA
    val m2 = periodB
    val m1Div = m1 / g
    val m2Div = m2 / g
    val dDiv = delta / g

    val eg = extGcd(m1Div, m2Div)
    val invM1 = ((eg[1] % m2Div) + m2Div) % m2Div

    val k0 = ((dDiv % m2Div) + m2Div) % m2Div
    val k = (k0 * invM1) % m2Div

    val x0 = startA + m1 * k
    val lcm = m1Div * m2

    val x0Mod = ((x0 % lcm) + lcm) % lcm

    val earliest = maxOf(startA + periodA, startB + periodB)

    val T = if (x0Mod >= earliest) {
        x0Mod
    } else {
        val diff = earliest - x0Mod
        val mult = (diff + lcm - 1) / lcm
        x0Mod + mult * lcm
    }

    val days = arrayOf("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday")
    val daysOffset = (T / 1440) % 7
    val dayIdx = (6 + daysOffset.toInt()) % 7
    val timeOfDay = (T % 1440).toInt()
    val hh = timeOfDay / 60
    val mm = timeOfDay % 60
    val timeStr = String.format("%02d:%02d", hh, mm)

    writer.write(days[dayIdx])
    writer.newLine()
    writer.write(timeStr)
    writer.newLine()
    writer.flush()
}