CF1747E
const int N = 1e7 + 5;
const int P = 1e9 + 7;
int add(int x, int y) { return (x + y < P ? x + y : x + y - P); }
void Add(int &x, int y) { x = (x + y < P ? x + y : x + y - P); }
int mul(int x, int y) { return (1ll * x * y) % P; }
void Mul(int &x, int y) { x = (1ll * x * y) % P; }
int fp(int x, int y) {
int res = 1;
for(; y; y >>= 1) {
if(y & 1) Mul(res, x);
Mul(x, x);
}
return res;
}
int n, m;
int fac[N], finv[N], pw[N];
void init(int n) {
fac[0] = pw[0] = 1;
FOR(i, 1, n) pw[i] = add(pw[i - 1], pw[i - 1]);
FOR(i, 1, n) fac[i] = mul(fac[i - 1], i);
finv[n] = fp(fac[n], P - 2);
ROF(i, n - 1, 0) finv[i] = mul(finv[i + 1], i + 1);
}
int C(int x, int y) {
if(x < y || y < 0) return 0;
return mul(mul(fac[x], finv[y]), finv[x - y]);
}
Add(ans, mul(
mul(C(n - 1, i - 1), (i + 1)),
add(
mul(C(i + m - 1, i + 1), pw[m - 2]),
mul(C(i + m, i), pw[m])
)
));