#include <cstdio> #include <vector> #include <utility> #include <algorithm> using namespace std; typedef long long llint; const int MAXN = 2012; const llint BASE = 1000000000; vector<pair<int, int> > factor[MAXN]; void init() { for (int i = 1; i < MAXN; ++i) { int t = i; for (int j = 2; j * j <= t; ++j) { int k = 0; while (t % j == 0) { t /= j; ++k; } if (k > 0) { factor.push_back(make_pair(j, k)); } } if (t > 1) { factor.push_back(make_pair(t, 1)); } } } void add(int r[MAXN], int k, const vector<pair<int, int> >& v) { for (int i = 0; i < (int)v.size(); ++i) { r[v.first] += k * v.second; } } int r[MAXN]; vector<llint> ans; int main() { int re, n, m; llint t; vector<llint> v; init(); scanf("%d", &re); for (int ri = 1; ri <= re; ++ri) { scanf("%d%d", &n, &m); if (n > m) { swap(n, m); } --m; fill(r, r + MAXN, 0); r[2] = 1; add(r, 1, factor[n]); for (int i = 1; i < m; ++i) { add(r, 2, factor[n + i]); } if (m > 0) { add(r, 1, factor[n + m]); } for (int i = 1; i <= m; ++i) { add(r, -2, factor); } add(r, -1, factor[m + 1]); t = 1; v.clear(); for (int i = 0; i < MAXN; ++i) { for (int j = 0; j < r; ++j) { if (t * i < BASE) { t *= i; } else { v.push_back(t); t = i; } } } if (t > 1) { v.push_back(t); } ans = vector<llint>(1, 1); for (int i = 0; i < (int)v.size(); ++i) { t = 0; for (int j = 0; j < (int)ans.size(); ++j) { t += ans[j] * v; ans[j] = t % BASE; t /= BASE; } while (t > 0) { ans.push_back(t % BASE); t /= BASE; } } printf("%lld", ans.back()); for (int j = (int)ans.size() - 2; j >= 0; --j) { printf("%09lld", ans[j]); } puts(""); } return 0; }