Walk
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

多多喜欢行走,有一天老师问他一个问题:在一个方格点阵中,左上角点的坐标为(1, 1),行坐标从上到下依次递增,列坐标从左到右依次递增,每次行走可以向上、下、左、右移动一格。现在要从(1, 1)点走到(N, M)点,在行走步数最少的情况下,有多少种行走方法?(答案可能过大,请对答案取模1000000007)

输入描述:

第一行输入一个正整数 T,代表询问次数 (1 ≤ T ≤ 100000)
接下来 T 行,每行输入两个正整数 N,M (1 ≤ N ≤ 106,1 ≤ M ≤ 106)

输出描述:

对于每次询问,输出一个正整数,代表在行走步数最少的情况下,从(1, 1)点走到(N, M)点的方法总数 (答案可能过大,请对答案取模1000000007)
示例1

输入

复制
1
2 2

输出

复制
2

说明

(1, 1)    (1, 2)
(2, 1)    (2, 2)
在步数最少的情况下,从(1, 1)走到(2, 2)的方法有2种:
第一种:(1, 1) -> (1, 2) -> (2, 2)
第二种:(1, 1) -> (2, 1) -> (2, 2)
示例2

输入

复制
1
2 3

输出

复制
3

说明

(1, 1)    (1, 2)    (1, 3)
(2, 1)    (2, 2)    (2, 3)
在步数最少的情况下,从(1, 1)走到(2, 3)的方法有3种:
第一种:(1, 1) -> (1, 2) -> (1, 3) -> (2, 3)
第二种:(1, 1) -> (1, 2) -> (2, 2) -> (2, 3)
第三种:(1, 1) -> (2, 1) -> (2, 2) -> (2, 3)
示例3

输入

复制
1
5 3

输出

复制
15