結果
問題 | No.1887 K Consecutive Ks (Easy) |
ユーザー |
👑 ![]() |
提出日時 | 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] の方は…233*3 = 9通り23321133→ 11 がまずいのか"""import sysfrom sys import stdindef ss(x1,y1,x2,y2):if x1 > x2 or y1 > y2:return 0x1 = 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 retN,M = map(int,stdin.readline().split())dp = [[0] * (M+1) for i in range(N+1)]dp[0] = [1] * (M+1)mod = 998244353for 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) ) % modfor c in range(M):dp[i][c+1] += dp[i][c]dp[i][c+1] %= modfor 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) - ansrevprint (ans % mod)