思路:先把第一项,即从1到m的累乘求出来,然后从第2项开始,每次都乘i+m-1然后除去i-1,
因为要取模,所以乘逆元。
我们可以先把从1到2x10^6的所有逆元求出来,然后再直接调用,因为数量较多,可以采用线性求逆元的方法
inv[1]=1;
for(int i=2;i<=M;i++)
inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
#include<iostream>
using namespace std;
typedef long long ll;
const int M=2e6;
const long long mod=1e9+7;
ll n,m,inv[M+1];
void ny()
{
inv[1]=1;
for(int i=2;i<=M;i++)
inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ny();
while(cin>>n>>m)
{
ll ans(0);
ll sum(1);
for(int j=1;j<=m;j++)
{
sum*=j;
sum%=mod;
}
ans+=sum;
ans%=mod;
for(int i=2;i<=n;i++)
{
sum=(sum%mod*(((i+m-1)*inv[i-1])%mod))%mod;
ans+=sum;
ans%=mod;
}
cout<<ans%mod<<endl;
}
return 0;
}
取模的地方改了好多次才改对。