折返跑
题号:NC278838
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

\,\,\,\,\,\,\,\,\,折返跑是一种跑步运动形式,运动者从一侧的杆子出发,跑向另一侧的杆子,绕过杆子跑回起点,绕过起点的杆子再跑向另一侧,不断重复这一过程。这种运动形式有助于高效利用空间,运动者可以在有限的区域内进行无限的锻炼。
\,\,\,\,\,\,\,\,\,了解了折返跑的运动方法后,\sf Zaoly不屑道:“哼,杆子不动的折返跑没有灵魂,杆子不断移动的才有意思!”说干就干,他立即进行了一场移动杆折返跑运动。
\,\,\,\,\,\,\,\,\,上体育课了!今天的项目是折返跑,笔直的跑道可以看作是一条数轴。跑道上有 n 个点位,其中,老师在 1 点和 n 点处各放了两根杆子,称为左杆和右杆,作为折返跑的折返点。
\,\,\,\,\,\,\,\,\,老师规定,今天一共需要跑 m 趟。我们认为,从一根杆子开始,跑到另一根杆子结束为一趟,显然,一共需要进行 m-1 次折返。\sf Zaoly偶然发现,杆子是可推动的,所以他有了一个大胆的想法——
\,\,\,\,\,\,\,\,\,\,\,\,\,\,\bullet\,每次跑至右杆折返后,都需要把右杆向左推动一段距离(大于 0),但仍保证右杆位于整数点,且在左杆的右边(不能与左杆重合);
\,\,\,\,\,\,\,\,\,\,\,\,\,\,\bullet\,每次跑至左杆折返后,都需要把左杆向右推一段距离(大于 0),但仍保证左杆位于整数点,且在右杆的左边(不能与右杆重合);
\,\,\,\,\,\,\,\,\,现在,给出整数 n 和 m 的值,请问\sf Zaoly一共有多少种不同的推杆方法?由于答案可能很大,请将答案对 (10^9+7) 取模后输出。注意,每次折返时都需要推杆,如果某一轮无法推动,则这一轮推杆非法。

输入描述:

~~~~~~每个测试文件均包含多组测试数据。第一行输入一个整数 T\left(1\le T\le 10^4\right) 代表数据组数,每组测试数据描述如下:
~~~~~~对于每一组测试数据,输入两个整数 n,m \left(1 \leq m < n \leq 10^6 \right) 代表点位的数量、折返跑的趟数。

输出描述:

~~~~~~对于每组数据,在一行上输出一个整数代表合法的推杆方法种类数。由于答案可能很大,请将答案对 (10^9+7) 取模后输出。
示例1

输入

复制
3
4 3
5 3
100 1

输出

复制
1
3
1

说明

~~~~~~对于第一组测试数据,有且仅有唯一的推杆方法:
~~~~~~~~~\bullet\在第一次折返时(位于右杆),将右杆向左推一个点位;随后在第二次折返时(位于左杆),将左杆向右推一个点位;

~~~~~~对于第二组测试数据,有以下三种推杆方法:
~~~~~~~~~\bullet\在第一次折返时(位于右杆),将右杆向左推一个点位;随后在第二次折返时(位于左杆),将左杆向右推一个点位;
~~~~~~~~~\bullet\在第一次折返时,将右杆向左推两个点位;随后在第二次折返时,将左杆向右推一个点位;
~~~~~~~~~\bullet\在第一次折返时,将右杆向左推一个点位;随后在第二次折返时,将左杆向右推两个点位。

~~~~~~对于第三组测试数据,由于只跑一趟,没有折返,所以没有推杆,这也算作一种推杆方法。