結果
| 問題 |
No.2791 Beginner Contest
|
| コンテスト | |
| ユーザー |
ID 21712
|
| 提出日時 | 2025-04-10 22:47:17 |
| 言語 | Go (1.23.4) |
| 結果 |
AC
|
| 実行時間 | 535 ms / 2,000 ms |
| コード長 | 1,537 bytes |
| コンパイル時間 | 12,606 ms |
| コンパイル使用メモリ | 241,060 KB |
| 実行使用メモリ | 8,388 KB |
| 最終ジャッジ日時 | 2025-04-10 22:47:43 |
| 合計ジャッジ時間 | 23,641 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 17 |
ソースコード
package main
import . "fmt"
func main() {
var n, k int
Scan(&n, &k)
ans := solve(n, k)
Println(ans)
}
func solve(n, k int) int {
if k > n {
return 1
}
const MOD = 998244353
dp1 := 0
dp2 := make([]int, n+1)
dp2[0] = 1
ans := 1
for i := k; i <= n; i++ {
dp1 = (dp1+dp2[i-k])%MOD
dp2[i] = dp1
ans = (ans+dp1)%MOD
}
return ans
}
func init() {
for n := 1; n <= 300; n++ {
for k := 1; k <= n; k++ {
sa := solve(n, k)
ha := hoge(n, k)
if sa != ha {
panic(Sprintf("n=%d,k=%d,sa=%d,ha=%d",n,k,sa,ha))
}
}
}
}
func hoge(n, k int) int {
if k > n {
return 1
}
const MOD = 998244353
// reference: https ://cp-algorithms.com/data_structures/fenwick.html#3-range-update-and-range-query
b1 := make([]int, n+3)
b2 := make([]int, n+3)
add := func(b []int, idx, x int) {
for x < 0 {
x += (-x+MOD-1)/MOD*MOD
}
for idx < len(b) {
b[idx] = (b[idx]+x)%MOD
idx += idx & -idx
}
}
rangeAdd := func(l, r, x int) {
add(b1, l, x)
add(b1, r+1, -x)
add(b2, l, x*(l-1))
add(b2, r+1, -x*r)
}
sum := func(b []int, idx int) int {
total := 0
for idx > 0 {
total = (total + b[idx])%MOD
idx -= idx & -idx
}
return total
}
prefixSum := func(idx int) int {
return (sum(b1, idx)*idx - sum(b2, idx))%MOD
}
rangeSum := func(l, r int) int {
return (prefixSum(r) - prefixSum(l-1))%MOD
}
rangeAdd(1, 1, 1)
for i := 1; i+k <= n+1; i++ {
x := rangeSum(i, i)
rangeAdd(i+k, n+1, x)
}
ans := rangeSum(1, n+1)
for ans < 0 {
ans += (-ans+MOD-1)/MOD*MOD
}
return ans
}
ID 21712