#include #include #include using namespace std; using namespace atcoder; using mint = modint1000000007; vector fac, finv; mint comb(int n ,int k) { mint ret = fac[n]; ret *= finv[k];ret *= finv[n-k]; return ret; } int main() { int H, W;cin >> H >> W; int T = H + W + 100; fac.assign(T+1, 1); finv.assign(T+1, 1); for (int i = 1;i <= T;i++) fac[i] = i * fac[i-1]; for (int i = 1;i <= T;i++) finv[i] = mint(fac[i]).inv(); mint als = 0; for (int i = 1;i < W;i++) { mint s = mint(2).pow(W-i) - 1; s = mint(s).pow(H); s *= comb(W, i); if (i%2 == 1) { als += s; } else { als -= s; } } mint ret = als; for (int i = 1;i <= H;i++) { mint s = mint(2).pow(H-i); s = mint(s).pow(W); s *= comb(H, i); if (i%2 == 1) { ret += s; } else { ret -= s; } } mint ans = mint(mint(2).pow(W)).pow(H) -ret; cout << ans.val() << endl; }