#P15998. [2024国家队集训北京站]子消息和
[2024国家队集训北京站]子消息和
题目描述
你被廉价通信组织雇佣来研究一项突破性的通信技术:子消息和(SMS)。这个革命性的想法如下。
给定一个长度为 的二进制字符串,以及一个满足 的正整数 。这个字符串的 SMS 由 个整数组成:
- 第一个数是前 位的和;
- 第二个数是第 位到第 位的和;
- 依此类推;
- 最后一个数是第 位到第 位的和。
例如,当 时,二进制字符串 110010 的 SMS 为 2 2 1,因为:
由于你还是新手,你的任务不是从给定的 SMS 中恢复原来的二进制字符串,而是计算有多少个二进制字符串可以形成这个 SMS。
输入格式
第一行包含两个用空格分隔的整数 和 。
第二行包含 个用空格分隔的整数,保证它至少是某个二进制字符串的 SMS。
输出格式
输出一个整数,表示与给定 SMS 对应的可能二进制字符串总数对 取模的结果。
样例输入
7 4
3 2 2 2
样例输出
3
样例解释
长度为 的可能字符串有:1011001、1101010 和 1110011。
数据范围与子任务
对于所有数据:
| 子任务编号 | 分值 | 的范围 | 的范围 |
|---|---|---|---|
| 1 | 12 | ||
| 2 | 无 | ||
| 3 | 16 | ||
| 4 | |||
| 5 | |||
| 6 | 28 | 无 |
难度评估
综合难度:省选中档 / NOI Day1 T1~T2;Codeforces 约 2000。
这题的关键在于从相邻两个窗口和入手。设原二进制串为 ,给定 SMS 为 。则有:
因此:
- 若 ,则 ;
- 若 ,则 ;
- 若 ,则 。
这样可以把位置之间的关系建成若干连通块,或者按下标模 的链处理。最后只需要考虑前 位:其中一部分已经被强制为 ,剩下若干自由变量需要选出一定数量为 ,答案就是一个组合数。
主要考点:滑动窗口差分、并查集/连通块、组合数取模、边界情况 与 。
容易出错的地方:
- 忘记处理 时只有一个窗口的情况;
- 没有注意 可达 ,不能枚举所有二进制串;
- 相邻窗口差值只能是 ,但题目保证输入合法,因此程序可不做复杂判错;
- 组合数需要对质数 取模,且 ,可以预处理阶乘和逆元。