冒泡排序

题目描述

有一个值域下标均为 $1\sim n$ 的排列或圆排列 $A$,定义 $f(A)$ 为将 $A$ 升序排序所需的最小操作次数。 每次操作中,你可以选择一个元素并向前**冒泡**若干次,一次**冒泡**定义为:若这个元素小于前一个元素,则可以交换它与前一个元素。当某次无法**冒泡**时,这次操作立即停止。否则可以连续**冒泡**任意次。 比如有排列 $[3,5,2,1,4]$,一次操作可以选择元素 $1$ ,得到排列 $[3,5,1,2,4],[3,1,5,2,4]$ 或 $[1,3,5,2,4]$ 。 若有圆排列 $[2,1,4,3]$,选择元素 $1$ 后可以得到圆排列 $[1,2,4,3],[3,2,4,1]$ 或 $[3,2,1,4]$ 。注意到圆排列中第 $1$ 个元素的前一个元素为第 $n$ 个元素。 排列或圆排列被升序排序,当且仅当对于所有 $\space 2 \leq i \leq n$,元素 $i$ 的前一个元素为元素 $i-1$。 给定 $n,k,type$,你需要: - 在 $type=1$ 时求有多少长为 $n$ 的排列 $A$ 满足 $f(A)=k$ 。 - 在 $type=2$ 时求有多少长为 $n$ 的圆排列 $A$ 满足 $f(A)=k$ 。 答案对 $10^9+7$ 取模。

输入输出格式

输入格式


输入一行三个正整数 $n,k,type$,具体含义见题目描述。

输出格式


输出一行一个整数,表示答案对 $10^9+7$ 取模后的结果。

输入输出样例

输入样例 #1

4 2 1

输出样例 #1

11

输入样例 #2

5 2 2

输出样例 #2

14

输入样例 #3

50 10 1

输出样例 #3

808620624

输入样例 #4

50 10 2

输出样例 #4

578144115

说明

#### 【样例解释 #1】 有如下合法排列: 1. $[1,4,2,3]$ 2. $[1,4,3,2]$ 3. $[2,1,4,3]$ 4. $[2,4,1,3]$ 5. $[2,4,3,1]$ 6. $[3,1,2,4]$ 7. $[3,1,4,2]$ 8. $[3,2,1,4]$ 9. $[3,2,4,1]$ 10. $[3,4,1,2]$ 11. $[3,4,2,1]$ #### 【样例解释 #2】 有如下合法圆排列: 1. $[1,2,5,3,4]$ 2. $[1,2,5,4,3]$ 3. $[1,3,2,5,4]$ 4. $[1,3,5,2,4]$ 5. $[1,3,5,4,2]$ 6. $[1,4,2,3,5]$ 7. $[1,4,2,5,3]$ 8. $[1,4,3,2,5]$ 9. $[1,4,3,5,2]$ 10. $[1,4,5,3,2]$ 11. $[1,5,2,4,3]$ 12. $[1,5,3,2,4]$ 13. $[1,5,3,4,2]$ 14. $[1,5,4,2,3]$ 需要注意的是,我们认为 $[1,2,5,3,4]$ 和 $[2,5,3,4,1]$ 等是同一个圆排列。 也就是我们认为两个圆排列不同,当且仅当存在一个 $2 \leq i \leq n$,满足两个圆排列中元素 $i$ 的前一个元素不同。 #### 【数据范围】 | 测试点编号 | $n \leq$ | $k \leq$ | $type=$ | |:------------:|:--------:|:--------:|:-------:| | $1 \sim 2$ | $7$ | $7$ | $1$ | | $3 \sim 4$ | $7$ | $7$ | $2$ | | $5 \sim 6$ | $15$ | $15$ | $1$ | | $7 \sim 8$ | $15$ | $15$ | $2$ | | $9 \sim 12$ | $50$ | $50$ | $1$ | | $13 \sim 16$ | $50$ | $50$ | $2$ | | $17$ | $500$ | $10$ | $1$ | | $18$ | $500$ | $10$ | $2$ | | $19$ | $500$ | $500$ | $1$ | | $20$ | $500$ | $500$ | $2$ | 对于所有数据,$1 \leq k < n \leq 500$,$1 \leq type \leq 2$。