CF2203F Binary Search with One Swap

题目描述

考虑以下在一个长度为 $n$ 的数组 $a$ 中查找整数 $x$ 的算法,数组元素从 $1$ 到 $n$ 编号: 1. 初始化 $l = 1$ 和 $r = n$; 2. 如果 $l > r$,结束算法并报告未找到目标元素; 3. 计算 $m = \lfloor \frac{l + r}{2} \rfloor$; 4. 如果 $a_m = x$,结束算法并报告找到目标元素; 5. 如果 $a_m < x$,令 $l = m + 1$,否则令 $r = m - 1$; 6. 转到步骤 $2$。 可以证明,如果数组 $a$ 是非递减有序的,那么该算法一定能成功找到 $a$ 中的任意元素。 你的任务如下:对于给定的 $n$,考虑所有满足 $1 \le i < j \le n$ 的数对 $(i, j)$。对于每个这样的数对,你需要计算它的**优美度**——即如果我们取数组 $a = [1, 2, 3, \dots, n]$ 并交换元素 $a_i$ 和 $a_j$,那么上述算法能够成功找到的整数 $x$(从 $1$ 到 $n$)的数量。然后,对于每个 $k$ 从 $0$ 到 $n$,你需要输出 $p_k$——优美度为 $k$ 的数对数量。

输入格式

输入仅有一行,包含一个整数 $n$($3 \le n \le 5 \cdot 10^6$)。

输出格式

输出 $n+1$ 个整数 $p_0, p_1, \dots, p_n$,其中 $p_k$ 是优美度为 $k$ 的数对 $(i, j)$ 的数量。

说明/提示

考虑 $n = 4$ 的示例: - 如果交换 $a_1$ 和 $a_2$,那么 $1$、$3$ 和 $4$ 可以被成功找到; - 如果交换 $a_1$ 和 $a_3$,那么 $2$ 和 $4$ 可以被成功找到; - 如果交换 $a_2$ 和 $a_3$,那么 $1$、$3$ 和 $4$ 可以被成功找到; - 如果交换 $a_1$ 和 $a_4$,那么 $2$ 和 $3$ 可以被成功找到; - 如果交换 $a_2$ 和 $a_4$,那么 $1$ 和 $4$ 可以被成功找到; - 如果交换 $a_3$ 和 $a_4$,那么 $1$、$2$ 和 $4$ 可以被成功找到。 由 DeepSeek V3.2 翻译