#P1435. 划分哨兵

    ID: 436 传统题 1000ms 256MiB 尝试: 0 已通过: 0 难度: (无) 上传者: 标签>提高+/省选-组合数学组合计数动态规划数学

划分哨兵

划分哨兵

题目描述

相信你一定了解过快速排序这种基于随机化的高效排序算法,在算法中,我们将从当前序列中,随机选择一个位置的数作为哨兵,然后采用双指针的技巧,通过不断对哨兵左右两边的数进行交换,从而使得哨兵左边的数全部小于哨兵,而其右边的数全部大于哨兵。完成后,我们依次对哨兵左边和右边的部分再次重复上述过程,直到最后不存在哨兵以外的部分,则向上回溯,最后完成对整个序列的排序。

Orange在学习快速排序,他对其中哨兵的划分产生了非常强烈的兴趣,认为哨兵在对于排列的快速排序中具有某些重要性质。对于一个排列 PP 来说,Orange定义哨兵为排列中的某个特殊位置的值 PiP_i,在他前面的数全部小于它,在他后面的数全部大于他。形式化的说,PiP_i 是哨兵,当且仅当 ji Pj>Pi\forall_{j i} \ P_j > P_i

对于一个 nn-排列 PP,Orange定义 f(x)f(x) 表示 xx 作为排列中唯一的哨兵的不同排列的种类数量。你的任务是,帮助Orange求出每个 f(x), (1xn)f(x), \ (1 \le x \le n) 的值,答案可能很大,你只需要输出答案 mod109+7\bmod 10^9+7 即可。

nn-排列指的是这样一个序列:对于一个长度为 nn 的序列,其中从 11 开始到 nn 的每个数都不重不漏地出现了恰好一次。

输入格式

输入一行,为一个整数 nn,表示排列长度。

数据范围

1n50001 \le n \le 5000

输出格式

输出一行,包含 nn 个整数,其中第 ii 个数为 f(i)f(i) 的值。

样例 #1

样例输入 #1

2

样例输出 #1

0 0

提示

样例解释

n=3n=3 时: 在所有 11 是哨兵的 33-排列中,只有 (1,3,2)(1,3,2) 满足 11 是唯一的哨兵,即 f(1)=1f(1) = 1。 在所有 22 是哨兵的 33-排列中,不存在任何一种排列使得 22 是唯一的哨兵,即 f(2)=0f(2) = 0。 在所有 33 是哨兵的 33-排列中,只有 (2,1,3)(2,1,3) 满足 33 是唯一的哨兵,即 f(3)=1f(3) = 1。 因此,答案为1 0 1