题解:
这个路径的最短方法也就是跟高中学过的排列组合公式一样,但是目前的问题是这个数字十分大,应该如何解决呢?
当然是逆元的思想了。
拿了我之前博客的一张图,这个是结论(菜鸡我就直接用了)

所以C(m+n-2,n-1)
比如说C(5,2)
=(5图片说明 4)/(2图片说明 1)
=(5图片说明 4图片说明 3图片说明 2图片说明 1)/(3图片说明 2图片说明 1图片说明 2图片说明 1)
所以得出以下结论:

fac[n]*quick(fac[n-m],mod-2)%mod*quick(fac[m],mod-2)%mod;

代码:

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 2e6+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 1e9+7;
using namespace std;

int fac[maxn];
int quick(int a,int n){
    int res=1;
    while(n){
        if(n&1) res=1ll*a*res%mod;
        a=1ll*a*a%mod;
        n>>=1;
    }
    return res;
}

int C(int n,int m){
    return 1ll*fac[n]*quick(fac[n-m],mod-2)%mod*quick(fac[m],mod-2)%mod;
}

int main()
{
    fac[0]=1;
    for(int i=1;i<=1000000+5;i++){
        fac[i]=1ll*fac[i-1]*i%mod;
    }
    int t;
    cin>>t;
    while(t--){
        int n,m;
        scanf("%d%d",&n,&m);
        printf("%d\n",C(n+m-2,n-1));
    }
    return 0;
}