https://coderun.yandex.ru/problem/number-system Сложная

Решение

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.math.BigInteger
import kotlin.math.abs
import kotlin.math.max
import kotlin.math.sqrt

fun main() {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))
    val s = reader.readLine().replace(" ", "")
    val parts = s.split("=")
    if (parts.size != 2) {
        writer.write("-1")
        writer.flush()
        return
    }
    fun parseExpression(expr: String, factor: Int): List<Pair<String, Int>> {
        val tokens = mutableListOf<Pair<String, Int>>()
        var sign = 1
        var current = StringBuilder()
        var i = 0
        while (i < expr.length) {
            val ch = expr[i]
            if (ch == '+' || ch == '-') {
                if (current.isNotEmpty()) {
                    tokens.add(Pair(current.toString(), sign * factor))
                    current = StringBuilder()
                }
                sign = if (ch == '+') 1 else -1
            } else {
                current.append(ch)
            }
            i++
        }
        if (current.isNotEmpty()) {
            tokens.add(Pair(current.toString(), sign * factor))
        }
        return tokens
    }
    val leftTokens = parseExpression(parts[0], 1)
    val rightTokens = parseExpression(parts[1], -1)
    val tokens = leftTokens + rightTokens
    var bMin = 2
    var maxDegree = 0
    for ((num, _) in tokens) {
        if (num.isEmpty()) continue
        var localMax = 0
        for (ch in num) {
            val d = if (ch in '0'..'9') ch - '0' else ch - 'A' + 10
            if (d > localMax) localMax = d
        }
        bMin = max(bMin, localMax + 1)
        maxDegree = max(maxDegree, num.length - 1)
    }
    val poly = IntArray(maxDegree + 1) { 0 }
    for ((num, sign) in tokens) {
        val len = num.length
        for (j in 0 until len) {
            val ch = num[j]
            val d = if (ch in '0'..'9') ch - '0' else ch - 'A' + 10
            poly[len - 1 - j] += sign * d
        }
    }
    var allZero = true
    for (coef in poly) {
        if (coef != 0) { allZero = false; break }
    }
    if (allZero) {
        writer.write(bMin.toString())
        writer.flush()
        return
    }
    var k = 0
    while (k < poly.size && poly[k] == 0) {
        k++
    }
    if (k == poly.size) {
        writer.write(bMin.toString())
        writer.flush()
        return
    }
    val Q0 = poly[k]
    val absQ0 = abs(Q0)
    val divisors = mutableSetOf<Int>()
    var i = 1
    while (i * i <= absQ0) {
        if (absQ0 % i == 0) {
            divisors.add(i)
            divisors.add(absQ0 / i)
        }
        i++
    }
    val candidates = divisors.filter { it >= bMin }.sorted()
    fun evaluate(b: Int): BigInteger {
        var res = BigInteger.valueOf(poly[poly.size - 1].toLong())
        for (i in poly.size - 2 downTo 0) {
            res = res.multiply(BigInteger.valueOf(b.toLong())).add(BigInteger.valueOf(poly[i].toLong()))
        }
        return res
    }
    for (cand in candidates) {
        if (evaluate(cand) == BigInteger.ZERO) {
            writer.write(cand.toString())
            writer.flush()
            return
        }
    }
    writer.write("-1")
    writer.flush()
}