#P14163. [ICPC 2022 Nanjing R] 堆里的 NaN

[ICPC 2022 Nanjing R] 堆里的 NaN

题目描述

预备知识:NaN\textbf{预备知识:NaN}

NaN\texttt{NaN} (Not a Number) 是 1985 年 IEEE 754 浮点数标准里引入的特殊浮点数。标准规定,当 NaN\texttt{NaN} 与一个浮点数 x\texttt{x} 进行比较时(x\texttt{x} 可以是正数,零,负数,甚至是 NaN\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{预备知识:堆}

堆是一种数据结构,可以用具有特殊性质的序列表示。以下算法展示了如何将 nn 个浮点数 a1,a2,,ana_1, a_2, \cdots, a_n 按顺序加入小根堆 HH 中,其中 HH 是一个初始为空的序列。

以下算法中,用 hih_i 表示 HH 的第 ii 个元素,用 j/2j/2 表示满足 2xj2x \le j 的最大整数 xx

:::align{center} :::

问题\textbf{问题}

给定一个整数 nn,考察这 nn 个元素的排列:从 11(n1)(n - 1) 的所有整数(含两端),再加上一个额外的元素 NaN\texttt{NaN}。称这 nn 个元素的一个排列 PP 是“堆序列”,若存在这 nn 个元素的一个排列 QQ 满足 P=HEAPIFY(Q)P = \text{\texttt{HEAPIFY}}(Q)

现在从这 nn 个元素的所有排列中等概率随机选取一个(也就是说,一个特定的排列被选中的概率是 1n!\frac{1}{n!}),求被选中的排列是堆序列的概率。

输入格式

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

第一行输入一个整数 nn1n1091 \le n \le 10^9)。

输出格式

每组数据输出一行表示答案。

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

5
1
3
7
10
20221218
1
666666672
55555556
596445110
3197361

提示

对于第二组样例数据,有 44 个堆序列。

  • $\{\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}\})$。

所以答案用有理数表示是 43!=23\frac{4}{3!} = \frac{2}{3}。因为 3×3333333361(modM)3 \times 333333336 \equiv 1 \pmod M,我们应该输出 2×333333336modM=6666666722 \times 333333336 \bmod M = 666666672