CF340E Iahub and Permutations

题目描述

Iahub 因为发明了冒泡排序图非常开心,一整天都待在办公室里写排列。Iahubina 因为 Iahub 不再重视她而感到生气。当 Iahub 离开时,Iahubina 来到他的办公室,破坏了他的研究工作。 女孩找到了一组对研究很重要的排列。该排列包含 $n$ 个互不相同的整数 $a_{1}, a_{2}, \ldots, a_{n}$,其中 $1 \leq a_{i} \leq n$。作为报复,她将排列中的一些元素替换为 $-1$。 当 Iahub 发现他的重要排列被破坏后,他试图恢复它。他唯一记得的是,原排列中没有任何不动点。不动点是指排列中的某个元素 $a_{k}$ 满足 $a_{k} = k$。你的任务是向 Iahub 证明,试图恢复原排列并不是个好主意。输出所有可能是 Iahub 原来的重要排列的方案数,结果对 $1000000007$($10^9+7$)取模。

输入格式

第一行包含一个整数 $n$($2 \leq n \leq 2000$)。 第二行包含 $n$ 个整数,表示 Iahub 的重要排列在 Iahubina 替换了一些值为 $-1$ 后的样子。 保证给定的排列中没有不动点。此外,给定序列中至少有两个 $-1$,且每个正整数在序列中至多出现一次。保证至少存在一种合法的原始排列。

输出格式

输出一个整数,表示 Iahub 可能恢复出原来的排列的方案数,对 $1000000007$ 取模。

说明/提示

对于第一个测试样例,两个没有不动点的排列分别是 \[2, 5, 4, 3, 1\] 和 \[5, 1, 4, 3, 2\]。其它排列都会存在至少一个不动点。 由 ChatGPT 5 翻译