P12320 [蓝桥杯 2024 国研究生组] 深度优先搜索

题目描述

小蓝正在学习深度优先搜索。给出一段小蓝写的代码 ```cpp void dfs(int rt, int deep, int fa) { a[++cnt] = deep; for (int i = head[rt]; i; i = e[i].next) if (e[i].to != fa) dfs(e[i].to, deep + 1, rt); } ``` 对一个有根树执行 `dfs(root, 0, 0)` 可以生成一个长度为树中结点个数的序列,依次表示对遍历的所有结点的深度,小蓝认为假如一个序列能够通过对一个有根树执行 `dfs` 得到,这个序列就是合法的。现在小蓝有一个只包含 $-1$ 和非负整数的序列,小蓝想要知道,有多少种把 $-1$ 替换成任意非负整数的方案,使得该序列合法。

输入格式

输入的第一行包含一个正整数 $n$ 表示序列长度。 第二行包含 $n$ 个非负整数或 $-1$,相邻整数之间使用一个空格分隔,表示序列中的数 $a_i$。

输出格式

输出一行包含一个整数,表示答案除以 $10^9 + 7$ 的余数。

说明/提示

### 样例说明 对于样例 $2$,两个合法的序列是 $\{0, 1, 1, 1\}$ 和 $\{0, 1, 2, 1\}$。 ### 评测用例规模与约定 - 对于 $30\%$ 的评测用例,保证序列中不会出现两个连续的 $-1$,即若 $a_i = -1$,则 $a_{i+1} \neq -1$。 - 对于 $50\%$ 的评测用例,$n \leq 300$; - 对于所有评测用例,$1 \leq n \leq 1000000$,$-1 \leq a_i \leq n$。