P11539 [Code+#5] 方案计数
题目背景
**题目来源:**[link](https://www.gitlink.org.cn/thusaa/codeplus5)。
题目描述
小 V 刚考完拓扑,闭区间套让他有点自闭,所以他决定把这一场 CP 安排一下。
我们首先选定一个数据范围 $N$,这里 $N$ 是一个整数。
考虑如下的函数:
```cpp
// rand_int(l, r) 返回闭区间 [l, r] 中的一个随机整数
vector ans;
void solve(int l, int r) {
if (l == r) {
ans.push_back(r);
return ;
}
int m = rand_int(l, r - 1);
if (rand_int(0, 1) == 0) {
solve(l, m);
solve(m + 1, r);
} else {
solve(m + 1, r);
solve(l, m);
}
}
```
我们初始令 $\texttt{ans}$ 为空,那么调用 $\texttt{solve(1, N)}$ 之后,$\texttt{ans}$ 里会存储一个排列。
现在的问题是,给定排列 $P$,问有多少种不同的随机数生成方法可以使这个 $\texttt{ans}$ 中存储的排列恰好为 $P$。
定义两种随机数生成方式是不同的,当且仅当在函数某次调用 $\texttt{rand\_int}$ 时,随机数生成器返回了不同的数。
方案数对 $998244353$ 取模。
输入格式
第一行一个正整数 $N$,保证 $N\le 5\times 10^5$。
接下来一行 $N$ 个整数,描述排列 $\{P_i\}$。
输出格式
输出一行一个整数,表示答案。
说明/提示
**数据范围:**
$\def\arraystretch{1.21}
\begin{array}{|c|c|c|}\hline
\bold{\small{子任务}}&\textbf{score}&\textbf{constraints}\\\hline
\text{A}&20&N\le5000,P_i=N-i+1\\\hline
\text{B}&10&N\le10^5,P_i=N-i+1\\\hline
\text{C}&30&N\le10^5\\\hline
\text{D}&40&N\le5\times10^5\\\hline
\end{array}$