結果
| 問題 | No.1887 K Consecutive Ks (Easy) | 
| コンテスト | |
| ユーザー | 👑  SPD_9X2 | 
| 提出日時 | 2022-03-25 22:57:41 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 598 ms / 2,000 ms | 
| コード長 | 1,761 bytes | 
| コンパイル時間 | 285 ms | 
| コンパイル使用メモリ | 81,664 KB | 
| 実行使用メモリ | 146,916 KB | 
| 最終ジャッジ日時 | 2024-10-14 07:01:49 | 
| 合計ジャッジ時間 | 5,523 ms | 
| ジャッジサーバーID (参考情報) | judge4 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 16 | 
ソースコード
"""
1887
まぁ、ない場合を計算すればヨシ
dp[i][v] = i番目まで見て、i番目に置いたのがvの場合の数…?
同じ数字はまとめておくことにする。
推移を考える。
まず、区間の長さを決めると、その数字は使用不可になる。
また、直前の数字は使用不可となる。
貰うdpで考えるか~
貰う時、lastindexを指定したとする。
直前の区間長に等しい色の場合に関しては、最初から全部除いておいていい。
自分の選ぶ色に関しては、
色cを選んだとき、
直前同じ色の時だけ、さらに除く。
ただし、あらかじめ除かれている場合はもう気にしなくてよい。
dp[i][c] に推移できないのは
dp[i-c以下][?]
か
dp[?][c]
である。
indsumは大きいほうから累積和しておく。
dp[?][c] の方は…
2
3
3*3 = 9通り
23
32
11
33
→ 11 がまずいのか
"""
import sys
from sys import stdin
def ss(x1,y1,x2,y2):
    if x1 > x2 or y1 > y2:
        return 0
    x1 = max(x1,0)
    ret = dp[x2][y2]
    if x1-1 >= 0:
        ret -= dp[x1-1][y2]
    if y1-1 >= 0:
        ret -= dp[x2][y1-1]
    if x1-1 >= 0 and y1-1 >= 0:
        ret += dp[x1-1][y1-1]
    return ret
N,M = map(int,stdin.readline().split())
dp = [[0] * (M+1) for i in range(N+1)]
dp[0] = [1] * (M+1)
mod = 998244353
for i in range(1,N+1):
    for c in range(1,M+1):
        dp[i][c] = ( ss(i-c+1,0,i-1,M) - ss(i-c+1,c,i-1,c) ) % mod
    for c in range(M):
        dp[i][c+1] += dp[i][c]
        dp[i][c+1] %= mod
    for c in range(M+1):
        dp[i][c] += dp[i-1][c]
        dp[i][c] %= mod
#print (dp)
ansrev = (ss(N,0,N,M) % mod)
ans = pow(M,N,mod) - ansrev
print (ans % mod)
            
            
            
        