結果

問題 No.1887 K Consecutive Ks (Easy)
ユーザー 👑 SPD_9X2SPD_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
権限があれば一括ダウンロードができます

ソースコード

diff #

"""

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)
0