挺水的但是我好久没写组合数了…
用这样一个思想,在1~m列中,考虑每一列上升几格,相当于把n-1个苹果放进m个篮子里,可以为空,问有几种方案。
这个就是一个组合数学经典问题了,考虑n个苹果放进m个篮子里,不可以为空的情况,用插板法,也就是把m-1个板子插进排成一排的果子里,分成m个不为空的区间,方案数为( C_{n-1}^{m-1} ),现在考虑n个苹果放进m个篮子里,可以为空的情况,可以想成每个篮子里事先都放了一个苹果,那么就转为了上一个问题,方案数为( C_{n+m-1}^{m-1} )
回到这道题上,答案就是( C_{n+m-2}^{m-1} )
#include<iostream>
#include<iostream>
using namespace std;
const int mod=1e9+7,N=1000005;
long long n,m,inv[N],ans=1;
long long ksm(long long a,long long b)
{
long long r=1ll;
while(b)
{
if(b&1)
r=r*a%mod;
a=a*a%mod;
b>>=1;
}
return r;
}
int main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n+m-2;i++)
ans=ans*i%mod;
for(int i=1;i<=n-1;i++)
ans=ans*ksm(i,mod-2)%mod;
for(int i=1;i<=m-1;i++)
ans=ans*ksm(i,mod-2)%mod;
printf("%lld
",ans);
return 0;
}