题目描述
小 Z 和小 H 想要合伙开一家公司,共有 $n$ 人前来应聘,编号为 $1 \sim n$,他们希望录用至少 $m$ 人。
小 H 是面试官,将在接下来 $n$ 天每天面试一个人。小 Z 负责决定面试顺序,即选择一个 $1 \sim n$ 的排列 $p$,在第 $i$ 天通知编号为 $p_i$ 的人前来面试。
小 H 准备了 $n$ 套难度不一的面试题,所有人的作答结果一致:第 $i$ 天的题难度为 $s_i \in \{0,1\}$,$s_i=0$ 表示没有人能做出(拒绝),$s_i=1$ 表示所有人都能做出(录用)。
然而每个人的耐心有上限:若编号为 $i$ 的人面试之前已经有不少于 $c_i$ 人被拒绝或放弃,则他也将放弃参加面试。
小 Z 想知道一共有多少种面试顺序 $p$ 能够录用至少 $m$ 人。输出排列数量对 $998244353$ 取模后的结果。
注:原评测使用文件输入输出(employ.in / employ.out),本站提交请使用标准输入输出,程序中不要写文件重定向代码。原题提交文件名:employ.cpp,编译选项 -O2 -std=c++14 -static。
输入格式
输入的第一行包含两个正整数 $n, m$,分别表示前来应聘的人数和希望录用的人数。
第二行包含一个长度为 $n$ 的字符串 $s_1 \dots s_n$,表示每一天面试题的难度。
第三行包含 $n$ 个非负整数 $c_1, c_2, \dots, c_n$,表示每个人的耐心上限。
输出格式
输出一行一个非负整数,表示能够录用至少 $m$ 人的排列 $p$ 的数量对 $998244353$ 取模后的结果。
样例输入
样例输出
提示
【样例 1 解释】
共有 2 种顺序:$p=[1,2,3]$ 依次录用 1 号和 3 号;$p=[2,1,3]$ 依次录用 2 号和 3 号。
【样例 2】输入 10 5 / 1101111011 / 6 0 4 2 1 2 5 4 3 3,输出 2204128。
【数据范围】
- $1 \le m \le n \le 500$;
- $s_i \in \{0,1\}$,$0 \le c_i \le n$。
测试点 25 个等分。特殊性质 A:所有 $s_i = 1$;B:$\sum s_i \le 18$。
原题另有附加样例 employ3~employ5(已收录为本题测试点)。