(large{题目链接})
(\)
(Large extbf{Solution: } large{1.DP,详见 ext{tlx blog xyx}}) (Large{ ext{tlx blog}}) (\)
( quad quad quad quad quad quad) (large{2. 由隔板法,方案数为C^{n-1}_{2m-n+1},然后线性求逆元即可。\有种 ext{O(n)}求阶乘逆元的方法,invleft[ n+1
ight] =dfrac {1}{left( n+1
ight) !},所以可以倒序推出逆元,invleft[ i+1
ight] imes left( i+1
ight) =dfrac {1}{i!}=invleft[ i
ight] 。})
(\)
(Large extbf{Code: })
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 4010;
const int p = 1e9 + 7;
int n, m;
ll inv[N], s[N];
int read() {
int x = 0;
char ch = getchar();
while (!isdigit(ch)) ch = getchar();
while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
return x;
}
inline ll quickpow(ll a, ll b) {
ll base = a, ans = 1;
for (; b ; b >>= 1, base = (base * base) % p) if (b & 1) ans = (ans * base) % p;
return ans;
}
int main() {
n = read(), m = read();
s[1] = 1;
for (int i = 2; i <= 3010; ++i) s[i] = (s[i - 1] * i) % p;
inv[3010] = quickpow(s[3010], p - 2);
for (int i = 3009; i >= 0; --i) inv[i] = inv[i + 1] * (i + 1) % p;
printf("%lld
", s[n + 2 * m - 1] * inv[n - 1] % p * inv[m << 1] % p);
return 0;
}