#define _CRT_SECURE_NO_WARNINGS
#pragma comment (linker, "/STACK:16777216")
#include <algorithm>
#include <numeric>
#include <string>
#include <string.h>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <iostream>
#include <fstream>
#include <cmath>
#include <math.h>
#include <iomanip>
#include <stdlib.h>
#include <time.h>
#include <sstream>
#include <stdio.h>
#include <stack>
#include <time.h>
#include <list>
#include <iterator>
using namespace std;
#define FOR(i,n) for (int i=0; i<n; ++i)
#define FORE(i,n) for (int i=0; i<=n; ++i)
#define REP(i,a,b) for (int i=a; i<b; ++i)
#define REPE(i,a,b) for (int i=a; i<=b; ++i)
#define ALL(c) (c).begin(), (c).end()
#define SORT(c) sort(ALL(c))
#define mp make_pair
#define pb push_back
#define INF (1e9)
typedef pair<int, int> PII;
typedef vector<PII> VPII;
typedef long long int LL;
typedef vector<int> VI;
typedef vector<bool> VB;
typedef vector<VI> VVI;
const long double pi = 3.14159265358979323846;
const int inf = (int)1e9;
const LL llinf = (LL)1e18;
const int base = 10;
double eps = 1e-9;
bool pred (const pair<PII,int>& i, const pair<PII,int>& j) {
if (i.first.second == j.first.second) {
return i.first.first < j.first.first;
}
return i.first.second < j.first.second;
}
LL dp[30][30];
int mod = inf + 7;
LL binpow(LL a, LL n) {
LL res = 1;
while(n) {
if (n & 1) {
res = (res * a) % mod;
}
a = (a * a) % mod;
n >>= 1;
}
return res;
}
int main(){
#ifdef _DEBUG
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#else
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
#endif
dp[0][0] = 1;
FORE(i,25) {
FORE(j,25) {
dp[i][j + 1] += dp[i][j];
dp[i + 1][j] += dp[i][j];
}
}
int a,b;
cin >> a >> b;
if (a > b) {
swap(a,b);
}
if (b < 25) {
cout << 0;
return 0;
}
if (b > 25 && b - a != 2) {
cout << 0;
return 0;
}
if (b == 25 && a > 23) {
cout << 0;
return 0;
}
if (b <= 25) {
cout << dp[a][b - 1] % mod;
return 0;
}
int x = b - 26;
LL now = dp[24][24] % mod;
LL res = (binpow(2, x) * now) % mod;
cout << res;
return 0;
}
I2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwojcHJhZ21hIGNvbW1lbnQgKGxpbmtlciwgIi9TVEFDSzoxNjc3NzIxNiIpCiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxudW1lcmljPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxxdWV1ZT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8bWF0aC5oPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGFjaz4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxpdGVyYXRvcj4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIEZPUihpLG4pIGZvciAoaW50IGk9MDsgaTxuOyArK2kpCiNkZWZpbmUgRk9SRShpLG4pIGZvciAoaW50IGk9MDsgaTw9bjsgKytpKQojZGVmaW5lIFJFUChpLGEsYikgZm9yIChpbnQgaT1hOyBpPGI7ICsraSkKI2RlZmluZSBSRVBFKGksYSxiKSBmb3IgKGludCBpPWE7IGk8PWI7ICsraSkKI2RlZmluZSBBTEwoYykgKGMpLmJlZ2luKCksIChjKS5lbmQoKQojZGVmaW5lIFNPUlQoYykgc29ydChBTEwoYykpCiNkZWZpbmUgbXAgbWFrZV9wYWlyCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgSU5GICgxZTkpCgp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IFBJSTsKdHlwZWRlZiB2ZWN0b3I8UElJPiBWUElJOwp0eXBlZGVmIGxvbmcgbG9uZyBpbnQgTEw7CnR5cGVkZWYgdmVjdG9yPGludD4gVkk7CnR5cGVkZWYgdmVjdG9yPGJvb2w+IFZCOyAKdHlwZWRlZiB2ZWN0b3I8Vkk+IFZWSTsKY29uc3QgbG9uZyBkb3VibGUgcGkgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2Owpjb25zdCBpbnQgaW5mID0gKGludCkxZTk7CmNvbnN0IExMIGxsaW5mID0gKExMKTFlMTg7Cgpjb25zdCBpbnQgYmFzZSA9IDEwOwpkb3VibGUgZXBzID0gMWUtOTsKCmJvb2wgcHJlZCAoY29uc3QgcGFpcjxQSUksaW50PiYgaSwgY29uc3QgcGFpcjxQSUksaW50PiYgaikgewogICAgaWYgKGkuZmlyc3Quc2Vjb25kID09IGouZmlyc3Quc2Vjb25kKSB7CiAgICAgICAgcmV0dXJuIGkuZmlyc3QuZmlyc3QgPCBqLmZpcnN0LmZpcnN0OwogICAgfQogICAgcmV0dXJuIGkuZmlyc3Quc2Vjb25kIDwgai5maXJzdC5zZWNvbmQ7Cn0KCkxMIGRwWzMwXVszMF07CmludCBtb2QgPSBpbmYgKyA3OwoKTEwgYmlucG93KExMIGEsIExMIG4pIHsKCUxMIHJlcyA9IDE7Cgl3aGlsZShuKSB7CgkJaWYgKG4gJiAxKSB7CgkJCXJlcyA9IChyZXMgKiBhKSAlIG1vZDsKCQl9CgkJYSA9IChhICogYSkgJSBtb2Q7CgkJbiA+Pj0gMTsKCX0KCXJldHVybiByZXM7Cn0KCmludCBtYWluKCl7CiNpZmRlZiBfREVCVUcKICAgIGZyZW9wZW4oImlucHV0LnR4dCIsInIiLHN0ZGluKTsKICAgIGZyZW9wZW4oIm91dHB1dC50eHQiLCJ3IixzdGRvdXQpOwojZWxzZQogICAgLy8gZnJlb3BlbigiaW5wdXQudHh0IiwiciIsc3RkaW4pOwogICAgLy8gZnJlb3Blbigib3V0cHV0LnR4dCIsInciLHN0ZG91dCk7CiNlbmRpZgoJZHBbMF1bMF0gPSAxOwoJRk9SRShpLDI1KSB7CgkJRk9SRShqLDI1KSB7CgkJCWRwW2ldW2ogKyAxXSArPSBkcFtpXVtqXTsKCQkJZHBbaSArIDFdW2pdICs9IGRwW2ldW2pdOwoJCX0KCX0KCWludCBhLGI7CgljaW4gPj4gYSA+PiBiOwoJaWYgKGEgPiBiKSB7CgkJc3dhcChhLGIpOwoJfQoJaWYgKGIgPCAyNSkgewoJCWNvdXQgPDwgMDsKCQlyZXR1cm4gMDsKCX0KCWlmIChiID4gMjUgJiYgYiAtIGEgIT0gMikgewoJCWNvdXQgPDwgMDsKCQlyZXR1cm4gMDsKCX0KCWlmIChiID09IDI1ICYmIGEgPiAyMykgewoJCWNvdXQgPDwgMDsKCQlyZXR1cm4gMDsKCX0KCWlmIChiIDw9IDI1KSB7CgkJY291dCA8PCBkcFthXVtiIC0gMV0gJSBtb2Q7CgkJcmV0dXJuIDA7Cgl9CglpbnQgeCA9IGIgLSAyNjsKCUxMIG5vdyA9IGRwWzI0XVsyNF0gJSBtb2Q7CglMTCByZXMgPSAoYmlucG93KDIsIHgpICogbm93KSAlIG1vZDsKCWNvdXQgPDwgcmVzOwogICAgcmV0dXJuIDA7Cn0KCg==