队列重排
题号:NC15614
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

有n(n≤500000) 个人排成一列,把他们解散后重排,使得"重排后前方" 跟"原排列前方" 一样的人不超过k(k<n) 个,问有几种方法数,答案请mod (109+7) 输出。
举例来说,有五个人编号为1∼5 间的整数,最初的排列由前至后依序为1, 2, 3, 4, 5,重排列后顺序由前至后变为1, 3, 4, 2, 5,其中只要编号为4 的人,"原排列前方" 跟"重排后前方" 都是编号为3 的人,故"重排后前方" 跟"原排列前方" 一样的人只有1 人。
原排列的第 1 个人和重排后的第 1 个人一定不会是「"重排后前方" 跟 "原排列前方" 一样的人」。

输入描述:

输入只有一行,有两个正整数 n,k,满足 1≤k<n≤500000。

输出描述:

请输出一行包含一个小于 109+7 的非负整数,表示总共的方法数 mod (109+7)。
示例1

输入

复制
3 1

输出

复制
5

说明

当 n=3 时,假设三个人在原排列的编号由前到后依序为 1、2、3。
重排列后的情形可分为下列 3 种:
"重排后前方" 和 "原排列前方" 一样的人数为 0 的有:1 3 2,2 1 3,3 2 1,3 种。
"重排后前方" 和 "原排列前方" 一样的人数为 1 的有:2 3 1,3 1 2,2 种。
"重排后前方" 和 "原排列前方" 一样的人数为 2 的仅有 1 2 3,1 种。
示例2

输入

复制
10 7

输出

复制
3628790