CF1750F Majority
题目描述
每个人都在愉快地编程,直到突然发生了电力短缺,最好的竞赛编程网站宕机了。幸运的是,系统管理员最近购买了一些新设备,包括一些 UPS。因此,仍有一些服务器在线,但我们需要所有服务器都正常工作,才能让本轮比赛计分。
可以将服务器看作一个长度为 $n$ 的二进制字符串 $s$。如果第 $i$ 台服务器在线,则 $s_i=1$,否则 $s_i=0$。
系统管理员可以进行如下称为“电力传播”的操作,操作包括以下几个阶段:
- 选择两个位置为 $1 \le i < j \le n$ 的服务器,且这两台服务器都在线(即 $s_i=s_j=1$)。传播只能从在线服务器开始。
- 检查是否有足够的电力进行传播。我们认为在区间 $[i, j]$ 内,若开启的服务器数量不少于关闭的服务器数量,则有足够的电力。更形式化地说,检查是否满足 $2 \cdot (s_i + s_{i+1} + \ldots + s_j) \ge j - i + 1$。
- 如果检查通过,则将区间 $[i, j]$ 内所有离线服务器全部开启。更形式化地说,对所有 $k$ 从 $i$ 到 $j$,令 $s_k := 1$。
我们称长度为 $n$ 的二进制字符串 $s$ 是“计分的”,如果可以通过若干次(可能为 $0$ 次)电力传播操作,将所有服务器都开启(即对所有 $1 \le i \le n$,有 $s_i=1$)。你的任务是计算长度为 $n$ 的计分二进制字符串的数量,结果对 $m$ 取模。
输入格式
第一行包含两个整数 $n$ 和 $m$($1 \le n \le 5000$,$10 \le m \le 10^9$),分别表示字符串的长度和取模的数。
输出格式
输出一个整数,表示长度为 $n$ 的计分二进制字符串的数量。由于答案可能很大,请输出对 $m$ 取模后的结果。
说明/提示
在第一个样例中,唯一的计分字符串是 11。所以答案是 $1$。
在第二个样例中,计分字符串有:
- 111;
- 101,因为可以对 $i=1$,$j=3$ 进行一次操作。
所以答案是 $2$。
在第三个样例中,计分字符串有:
- 1001;
- 1111;
- 1011;
- 1101。
所以答案是 $4$。
由 ChatGPT 4.1 翻译