結果
問題 | No.2754 Cumulate and Drop |
ユーザー | titia |
提出日時 | 2024-05-13 01:27:28 |
言語 | Kotlin (1.9.23) |
結果 |
AC
|
実行時間 | 662 ms / 2,000 ms |
コード長 | 1,272 bytes |
コンパイル時間 | 14,590 ms |
コンパイル使用メモリ | 440,112 KB |
実行使用メモリ | 102,820 KB |
最終ジャッジ日時 | 2024-05-13 01:27:58 |
合計ジャッジ時間 | 22,528 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 358 ms
68,860 KB |
testcase_01 | AC | 323 ms
68,624 KB |
testcase_02 | AC | 365 ms
68,716 KB |
testcase_03 | AC | 340 ms
68,780 KB |
testcase_04 | AC | 333 ms
68,648 KB |
testcase_05 | AC | 334 ms
68,772 KB |
testcase_06 | AC | 353 ms
68,808 KB |
testcase_07 | AC | 331 ms
68,768 KB |
testcase_08 | AC | 488 ms
77,484 KB |
testcase_09 | AC | 603 ms
92,464 KB |
testcase_10 | AC | 605 ms
98,600 KB |
testcase_11 | AC | 592 ms
85,584 KB |
testcase_12 | AC | 636 ms
102,792 KB |
testcase_13 | AC | 661 ms
102,688 KB |
testcase_14 | AC | 632 ms
102,820 KB |
testcase_15 | AC | 586 ms
85,604 KB |
testcase_16 | AC | 492 ms
75,288 KB |
testcase_17 | AC | 662 ms
102,620 KB |
testcase_18 | AC | 620 ms
102,712 KB |
testcase_19 | AC | 648 ms
102,748 KB |
ソースコード
fun main() { val n = readLine()!!.toInt() val a = readLine()!!.split(" ").map { it.toLong() } val mod = 998244353L val fact = LongArray(500000) { 1L } for (i in 1 until fact.size) { fact[i] = fact[i - 1] * i % mod } val factInv = LongArray(fact.size) { i -> if (i == fact.lastIndex) fact.last().modPow(mod - 2, mod) else 0L } for (i in fact.lastIndex - 1 downTo 0) { factInv[i] = factInv[i + 1] * (i + 1) % mod } fun combi(a: Int, b: Int): Long { return if (b in 0..a) { fact[a] * factInv[b] % mod * factInv[a - b] % mod } else { 0L } } fun cat(i: Int, j: Int): Long { return (combi(i + j + 1, j) - 2 * combi(i + j, j - 1)% mod + mod) % mod } var ans = 0L a.reversed().forEachIndexed { i, ai -> ans = (ans + ai.toLong() * cat(n - 1, i) % mod) % mod } println(ans) } private fun Long.modPow(exponent: Long, modulus: Long): Long { var result = 1L var exp = exponent var base = this % modulus while (exp > 0) { if (exp and 1 == 1L) { result = result * base % modulus } base = base * base % modulus exp = exp shr 1 } return result }