結果

問題 No.1611 Minimum Multiple with Double Divisors
ユーザー 14番
提出日時 2022-06-08 15:45:08
言語 Kotlin
(2.1.0)
結果
WA  
実行時間 -
コード長 1,487 bytes
コンパイル時間 11,995 ms
コンパイル使用メモリ 448,204 KB
実行使用メモリ 131,228 KB
最終ジャッジ日時 2024-09-21 05:09:55
合計ジャッジ時間 26,432 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample -- * 2
other WA * 11 TLE * 1 -- * 25
権限があれば一括ダウンロードができます
コンパイルメッセージ
Main.kt:1:10: warning: parameter 'args' is never used
fun main(args: Array<String>) {
         ^
Main.kt:5:13: warning: 'appendln(Long): kotlin.text.StringBuilder /* = java.lang.StringBuilder */' is deprecated. Use appendLine instead. Note that the new method always appends the line feed character '\n' regardless of the system line separator.
        ans.appendln(getAns(readLine()!!.toLong()))
            ^

ソースコード

diff #

fun main(args: Array<String>) {
    val t = readLine()!!.toInt()
    val ans = java.lang.StringBuilder()
    repeat(t){ _ ->
        ans.appendln(getAns(readLine()!!.toLong()))
    }
    print(ans.toString())
}

fun getAns(num:Long):Long {
    if(num == 1L) {
        return 2
    }
    val prime = primeDivide(num)
    val keys = prime.keys.toList()
    if(keys.size == 1 && keys.first() == 2L) {
        return num*3
    }
    var tmp = Long.MAX_VALUE
    for(i in primeList.indices) {
        if(keys.size <= i) {
            tmp = primeList[i]
            break
        }
        if(keys[i] != primeList[i]) {
            tmp = primeList[i]
            break
        }
    }
    val total = prime.values.sum()
    return Math.min(tmp, 1L shl total) * num
}
val primeList = mutableListOf<Long>().also {
    val max = 1_000_000
    val flag = BooleanArray(max+1)
    for(i in 2..max) {
        if(flag[i]) {
            continue
        }
        it.add(i.toLong())
        for(j in 1..max) {
            if(i*j>max) {
                break
            }
            flag[i*j] = true
        }
    }
}

fun primeDivide(num:Long):Map<Long,Int> {
    var n = num
    val ret = mutableMapOf<Long,Int>()
    for(prime in primeList) {
        if(prime*prime > n) {
            if(n > 1) {
                ret[n] = 1
            }
            break
        }
        while (n % prime == 0L) {
            ret[prime] = (ret[prime]?:0)+1
            n /= prime
        }
    }
    return ret
}
0