P14163 [ICPC 2022 Nanjing R] 堆里的 NaN

题目描述

$$\textbf{预备知识:NaN}$$ $\texttt{NaN}$ (Not a Number) 是 1985 年 IEEE 754 浮点数标准里引入的特殊浮点数。标准规定,当 $\texttt{NaN}$ 与一个浮点数 $\texttt{x}$ 进行比较时($\texttt{x}$ 可以是正数,零,负数,甚至是 $\texttt{NaN}$ 本身),应当返回以下结果。 $$ \begin{array}{|c|c|c|c|c|c|c|} \hline \textbf{比较} & \texttt{NaN} \ge \texttt{x} & \texttt{NaN} \le \texttt{x} & \texttt{NaN} > \texttt{x} & \texttt{NaN} < \texttt{x} & \texttt{NaN} = \texttt{x} & \texttt{NaN} \ne \texttt{x} \\ \hline \textbf{结果} & False & False & False & False & False & True \\ \hline \end{array} $$ $$\textbf{预备知识:堆}$$ 堆是一种数据结构,可以用具有特殊性质的序列表示。以下算法展示了如何将 $n$ 个浮点数 $a_1, a_2, \cdots, a_n$ 按顺序加入小根堆 $H$ 中,其中 $H$ 是一个初始为空的序列。 以下算法中,用 $h_i$ 表示 $H$ 的第 $i$ 个元素,用 $j/2$ 表示满足 $2x \le j$ 的最大整数 $x$。 :::align{center} ![](https://cdn.luogu.com.cn/upload/image_hosting/i4ewkc8v.png) ::: $$\textbf{问题}$$ 给定一个整数 $n$,考察这 $n$ 个元素的排列:从 $1$ 到 $(n - 1)$ 的所有整数(含两端),再加上一个额外的元素 $\texttt{NaN}$。称这 $n$ 个元素的一个排列 $P$ 是“堆序列”,若存在这 $n$ 个元素的一个排列 $Q$ 满足 $P = \text{\texttt{HEAPIFY}}(Q)$。 现在从这 $n$ 个元素的所有排列中等概率随机选取一个(也就是说,一个特定的排列被选中的概率是 $\frac{1}{n!}$),求被选中的排列是堆序列的概率。

输入格式

有多组测试数据。第一行输入一个整数 $T$($1 \le T \le 10^3$)表示测试数据组数,对于每组测试数据: 第一行输入一个整数 $n$($1 \le n \le 10^9$)。

输出格式

每组数据输出一行表示答案。 可以证明答案是一个有理数 $\frac{p}{q}$。为了避免精度问题,请输出整数 $(pq^{-1} \bmod M)$ 作为答案,其中 $M = 10^9 + 7$,$q^{-1}$ 是满足 $qq^{-1} \equiv 1 \pmod M$ 的整数。

说明/提示

对于第二组样例数据,有 $4$ 个堆序列。 - $\{\texttt{NaN}, 1, 2\} = \text{\texttt{HEAPIFY}}(\{\texttt{NaN}, 1, 2\})$。 - $\{\texttt{NaN}, 2, 1\} = \text{\texttt{HEAPIFY}}(\{\texttt{NaN}, 2, 1\})$。 - $\{1, \texttt{NaN}, 2\} = \text{\texttt{HEAPIFY}}(\{1, \texttt{NaN}, 2\}) = \text{\texttt{HEAPIFY}}(\{2, \texttt{NaN}, 1\})$。 - $\{1, 2, \texttt{NaN}\} = \text{\texttt{HEAPIFY}}(\{1, 2, \texttt{NaN}\}) = \text{\texttt{HEAPIFY}}(\{2, 1, \texttt{NaN}\})$。 所以答案用有理数表示是 $\frac{4}{3!} = \frac{2}{3}$。因为 $3 \times 333333336 \equiv 1 \pmod M$,我们应该输出 $2 \times 333333336 \bmod M = 666666672$。