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