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

京公网安备 11010502036488号