intd1(int x, int y){ if ((x < y) || ((x & 1) != (y & 1))) return0; returnC(x, (x + y) / 2); } intd2(int x, int y, int k){ if (k >= 0 && k <= y) returnd1(x, y); elseif (k < 0) returnd1(x, -2 * k + y); elsereturnd1(x, 2 * k - y); } intd3(int x, int y, int k){ returnredmod(d1(x, y) - d2(x, y, k)); } intd5(int, int, int, int); intd4(int x, int y, int k1, int k2){ if (x < y - 2 * k1) return0; elsereturnaddmod(d5(x, y - 2 * k1, -k2, k2 - 2 * k1) + d4(x, y, 2 * k1 - k2, k2)); } intd5(int x, int y, int k1, int k2){ if (x < y - 2 * k1) returnd3(x, y, k2); elsereturnredmod(redmod(d1(x, y) - d2(x, y, k2)) - d4(x, y, k1, k2)); }
#include<bits/stdc++.h> usingnamespace std; #define int long long constint MAXn = 1e6; constint MAXm = 1e6; constint MOD = 1e9 + 7;
template <typename T> inlinevoidread(T &a){ char c;for (c = getchar(); (c < '0' || c > '9') && c != '-'; c = getchar());bool f = c == '-';T x = f ? 0 : (c ^ '0');for (c = getchar(); c >= '0' && c <= '9'; c = getchar()) {x = x * 10 + (c ^ '0');}a = f ? -x : x; } template <typename T, typename ...Argv> inlinevoidread(T &a, Argv &...argv){ read(a), read(argv...); }
inlineintaddmod(int x){ return (x >= MOD) ? x - MOD : x; } inlineintredmod(int x){ return (x < 0) ? x + MOD : x; }
constint MAXfac = MAXn * 2 + MAXm + 1; int fac[MAXfac + 10], invfac[MAXfac + 10]; voidevafacinvfac(int n){ fac[0] = invfac[0] = fac[1] = invfac[1] = 1; for (int i = 2; i <= n; ++i) { fac[i] = fac[i - 1] * i % MOD; } for (int i = 2; i <= n; ++i) { invfac[i] = (MOD - MOD / i) * invfac[MOD % i] % MOD; }'' for (int i = 2; i <= n; ++i) { invfac[i] = invfac[i] * invfac[i - 1] % MOD; } } inline int C(int n, int m) { return fac[n] * invfac[m] % MOD * invfac[n - m] % MOD; } int d1(int x, int y) { if ((x < y) || ((x & 1) != (y & 1))) return 0; return C(x, (x + y) / 2); } int d2(int x, int y, int k) { if (k >= 0 && k <= y) return d1(x, y); else if (k < 0) return d1(x, -2 * k + y); else return d1(x, 2 * k - y); } int d3(int x, int y, int k) { return redmod(d1(x, y) - d2(x, y, k)); } int d5(int, int, int, int); int d4(int x, int y, int k1, int k2) { if (x < y - 2 * k1) return 0; else return addmod(d5(x, y - 2 * k1, -k2, k2 - 2 * k1) + d4(x, y, 2 * k1 - k2, k2)); } int d5(int x, int y, int k1, int k2) { if (x < y - 2 * k1) return d3(x, y, k2); else return redmod(redmod(d1(x, y) - d2(x, y, k2)) - d4(x, y, k1, k2)); } int n, m; signed main() { read(n, m); evafacinvfac(n * 2 + m + 1); printf("%lld\n", d5(2 * n + m + 1, m + 1, -1, m + 2)); return 0; }