CF1920E Counting Binary Strings

题目描述

Patrick 认为一个二进制字符串的子串是“好”的,当且仅当该子串恰好包含一个 $1$。 请帮助 Patrick 计算有多少个二进制字符串 $s$ 满足以下条件: - $s$ 恰好包含 $n$ 个“好”子串; - $s$ 没有长度严格大于 $k$ 的“好”子串。 注意,子串按其在字符串中的位置区分,所以如果 $s=1010$,你需要分别计数两个 $10$ 的出现。 $^\dagger$ 字符串 $a$ 是字符串 $b$ 的子串,当且仅当 $a$ 可以通过从 $b$ 的开头和结尾各删除若干(可能为零或全部)字符得到。 $^\ddagger$ 二进制字符串是仅包含字符 $0$ 和 $1$ 的字符串。

输入格式

每组测试包含多组测试用例。第一行包含一个整数 $t$($1 \leq t \leq 2500$),表示测试用例的数量。接下来每组测试用例包含一行,包含两个整数 $n$ 和 $k$($1 \leq n \leq 2500$,$1 \leq k \leq n$),分别表示所需“好”子串的数量和“好”子串允许的最大长度。 保证所有测试用例中 $n$ 的总和不超过 $2500$。

输出格式

对于每个测试用例,输出一个整数,表示满足条件的二进制字符串 $s$ 的数量。由于答案可能很大,请输出对 $998\,244\,353$ 取模后的结果。

说明/提示

在第一个测试用例中,唯一合适的二进制字符串是 $1$。字符串 $01$ 不合适,因为它包含了一个长度为 $2 > 1$ 的“好”子串 $01$。 在第二个测试用例中,合适的二进制字符串有 $011$、$110$ 和 $111$。 在第三个测试用例中,合适的二进制字符串有 $101$、$0110$、$0111$、$1110$ 和 $1111$。 由 ChatGPT 4.1 翻译