题目描述
n 个同学排成一行进行一场游戏;
从左边数第 i 个人说:他左边有 ai 个说谎者(不包括他们自己);
每个同学要么诚实,要么是说谎者;
没有两个说谎者站在一起;
诚实的同学总是说真话,说谎者可以说真话或谎言,因此他们的陈述可被认为是不可靠的。
你想要确定不同的合法情况数量,结果对 998244353 取模。
如果至少有一个同学在某种情况中是诚实的,而在另一个情况中是说谎者,则这两个情况视为不同。
输入格式
从 lie.in 读入数据。
第一行两个整数 n,c,n 含义见题目描述,c 为子任务编号,
接下来一行 n 个整数,描述 a 数组。
输出格式
输出答案到 lie.out。
输出一个整数表示不同合法情况的数量,对 998244353 取模。
样例
我们将用 红色 来标记说谎者,用 蓝色 来标记诚实的人。
3 4
0 1 2
1
唯一的可能是 (0,1,2)
5 4
0 0 1 1 2
3
三种可能的情况分别是:(0,0,1,1,2), (0,0,1,1,2), (0,0,1,1,2)
5 4
0 1 2 3 4
0
5 4
0 0 1 1 1
4
5 4
5 1 5 2 5
1
1 1
0
2
4 4
2 3 1 1
0
见下发文件
见下发文件
下发文件.zip
子任务与数据范围
对于所有数据,保证 1≤n≤2×105, 0≤ai≤n,
测评使用捆绑测试,本题不卡常,短时限是为了防止卡评测。
子任务编号 |
n |
ai |
特殊性质 |
分数 |
1 |
≤2 |
≤n |
N/A |
20 |
2 |
≤3×103 |
≤0 |
10 |
3 |
≥1×105 |
≤n |
保证 ai 的取值在 [0,i−1] 中独立均匀随机生成 |
20 |
4 |
≤3×103 |
N/A |
30 |
5 |
≤2×105 |
20 |