#include <bits/stdc++.h>
using namespace std;
long long modpow(long long a, long long n, long long mod) {
  long long res = 1;
  while (n > 0) {
    if (n & 1) (res *= a) %= mod;
    (a *= a) %= mod;
    n >>= 1;
  }
  return res;
}
long long modinv(long long a, long long m) {
  long long b = m, u = 1, v = 0;
  while (b) {
    long long t = a / b;
    swap(a -= t * b, b);
    swap(u -= t * v, v);
  }
  return (u + m) % m;
}
vector<long long> enum_divisors(long long n) {
  vector<long long> res;
  for (long long i = 1LL; i * i <= n; i++) {
    if (n % i != 0) continue;
    res.emplace_back(i);
    if (i != n / i) res.emplace_back(n / i);
  }
  sort(res.begin(), res.end());
  return res;
}
bool is_primitive(long long x, long long p) {
  for (auto d : enum_divisors(p - 1))
    if (d != p - 1) {
      if (modpow(x, d, p) == 1) return false;
    }
  return true;
}
template <long long mod, long long primitive_root>
struct NTT {
  void dft(vector<long long> &a, bool inv) {
    int n = a.size();
    for (int i = 0, j = 1; j < n - 1; j++) {
      for (int k = n >> 1; k > (i ^= k); k >>= 1)
        ;
      if (i > j) swap(a[i], a[j]);
    }
    for (int t = 2; t <= n; t <<= 1) {
      long long wt = modpow(primitive_root, (mod - 1) / t, mod);
      if (inv) wt = modinv(wt, mod);
      for (int i = 0; i < n; i += t) {
        long long w = 1;
        for (int j = 0; j < t / 2; j++) {
          long long u = a[i + j], v = a[i + j + t / 2] * w % mod;
          a[i + j] = (u + v) % mod;
          a[i + j + t / 2] = (u - v + mod) % mod;
          w = w * wt % mod;
        }
      }
    }
    if (inv) {
      long long inv_n = modinv(n, mod);
      for (int i = 0; i < n; i++) a[i] = a[i] * inv_n % mod;
    }
  }
  vector<long long> multiply(vector<long long> &a, vector<long long> &b) {
    int sz = 1;
    while (sz < (int)a.size() + (int)b.size() - 1) sz <<= 1;
    vector<long long> x(sz), y(sz);
    for (int i = 0; i < (int)a.size(); i++) x[i] = a[i];
    for (int i = 0; i < (int)b.size(); i++) y[i] = b[i];
    dft(x, false), dft(y, false);
    for (int i = 0; i < sz; i++) x[i] = x[i] * y[i] % mod;
    dft(x, true);
    x.resize(a.size() + b.size() - 1);
    return x;
  }
  bool check() { return is_primitive(mod, primitive_root); }
};
NTT<7340033, 5> ntt;
const int N = 28;
const int M = 1000;
vector<vector<long long>> dp(N + 2, vector<long long>(M + 1, 0));
void init() {
  for (int i = 0; i <= N; i++) {
    dp[i][0] = 1;
    auto d = ntt.multiply(dp[i], dp[i]);
    dp[i + 1] = ntt.multiply(d, d);
    dp[i + 1].insert(dp[i + 1].begin(), 0);
    dp[i + 1].resize(M + 1);
  }
}
int main() {
  init();
  auto height = [&](int n) {
    int res = 0;
    while (n > 1 && n % 2) res++, n /= 2;
    return res;
  };
  int q;
  cin >> q;
  while (q--) {
    int n, k;
    cin >> n >> k;
    cout << dp[height(n)][k] << endl;
  }
  return 0;
}
