思路:先把第一项,即从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;
}
取模的地方改了好多次才改对。