配点 : 600 点
問題文
1,…,n と −1 からなる数列 a1,…,an と整数 d が与えられます。
以下の条件を満たす数列 p1,…,pn はいくつありますか?
答えを 998244353 で割ったあまりを出力してください。
- p1,…,pn は 1,…,n の順列
- i=1,…,n について、 ai=−1 ならば ai=pi (つまり、a1,…,an の −1 の項を適切に置き換えることで p1,…,pn に書き換えできる)
- i=1,…,n について、 ∣pi−i∣≤d
制約
- 1≤d≤5
- d<n≤500
- 1≤ai≤n または ai=−1
- ai=−1 ならば ∣ai−i∣≤d
- i=j かつ ai,aj=−1 ならば ai=aj
- 入力はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
n d
a1 … an
出力
条件を満たす数列の数を 998244353 で割ったあまりを出力せよ。
4 2
3 -1 1 -1
2
(3,2,1,4) と (3,4,1,2) が条件を満たします。
5 1
2 3 4 5 -1
0
−1 を置き換えて得られる 1,2,3,4,5 の順列は (2,3,4,5,1) のみです。
この順列は、5 項目が条件を満たさないため、答えは 0 です。
16 5
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
794673086
998244353 で割ったあまりを出力してください。