#P15998. [2024国家队集训北京站]子消息和

[2024国家队集训北京站]子消息和

题目描述

你被廉价通信组织雇佣来研究一项突破性的通信技术:子消息和(SMS)。这个革命性的想法如下。

给定一个长度为 NN 的二进制字符串,以及一个满足 KNK \le N 的正整数 KK。这个字符串的 SMS 由 NK+1N-K+1 个整数组成:

  • 第一个数是前 KK 位的和;
  • 第二个数是第 22 位到第 K+1K+1 位的和;
  • 依此类推;
  • 最后一个数是第 NK+1N-K+1 位到第 NN 位的和。

例如,当 K=4K=4 时,二进制字符串 110010 的 SMS 为 2 2 1,因为:

1+1+0+0=2,1+0+0+1=2,0+0+1+0=1.1+1+0+0=2,\qquad 1+0+0+1=2,\qquad 0+0+1+0=1.

由于你还是新手,你的任务不是从给定的 SMS 中恢复原来的二进制字符串,而是计算有多少个二进制字符串可以形成这个 SMS。

输入格式

第一行包含两个用空格分隔的整数 NNKK

第二行包含 NK+1N-K+1 个用空格分隔的整数,保证它至少是某个二进制字符串的 SMS。

输出格式

输出一个整数,表示与给定 SMS 对应的可能二进制字符串总数对 106+310^6+3 取模的结果。

样例输入

7 4
3 2 2 2

样例输出

3

样例解释

长度为 77 的可能字符串有:101100111010101110011

数据范围与子任务

对于所有数据:

1N106,1KN.1 \le N \le 10^6,\qquad 1 \le K \le N.
子任务编号 分值 NN 的范围 KK 的范围
1 12 1N101 \le N \le 10 K3K \le 3
2
3 16 1N10001 \le N \le 1000 K10K \le 10
4 1N1061 \le N \le 10^6 K20K \le 20
5 K3000K \le 3000
6 28

难度评估

综合难度:省选中档 / NOI Day1 T1~T2;Codeforces 约 2000。

这题的关键在于从相邻两个窗口和入手。设原二进制串为 x1,x2,,xNx_1,x_2,\ldots,x_N,给定 SMS 为 a1,a2,,aNK+1a_1,a_2,\ldots,a_{N-K+1}。则有:

ai+1ai=xi+Kxi.a_{i+1}-a_i=x_{i+K}-x_i.

因此:

  • ai+1=aia_{i+1}=a_i,则 xi=xi+Kx_i=x_{i+K}
  • ai+1=ai+1a_{i+1}=a_i+1,则 xi=0,xi+K=1x_i=0,x_{i+K}=1
  • ai+1=ai1a_{i+1}=a_i-1,则 xi=1,xi+K=0x_i=1,x_{i+K}=0

这样可以把位置之间的关系建成若干连通块,或者按下标模 KK 的链处理。最后只需要考虑前 KK 位:其中一部分已经被强制为 0/10/1,剩下若干自由变量需要选出一定数量为 11,答案就是一个组合数。

主要考点:滑动窗口差分、并查集/连通块、组合数取模、边界情况 K=1K=1K=NK=N

容易出错的地方:

  1. 忘记处理 K=NK=N 时只有一个窗口的情况;
  2. 没有注意 NN 可达 10610^6,不能枚举所有二进制串;
  3. 相邻窗口差值只能是 1,0,1-1,0,1,但题目保证输入合法,因此程序可不做复杂判错;
  4. 组合数需要对质数 106+310^6+3 取模,且 N<106+3N<10^6+3,可以预处理阶乘和逆元。