#include <bits/stdc++.h>
using namespace std;
template <typename S, typename T>
ostream& operator<<(ostream& out, pair<S, T> const& p) {
  out << '(' << p.first << ", " << p.second << ')';
  return out;
}
template <typename T>
ostream& operator<<(ostream& out, vector<T> const& v) {
  int l = v.size();
  for (int i = 0; i < l - 1; i++) out << v[i] << ' ';
  if (l > 0) out << v[l - 1];
  return out;
}
template <typename T>
void trace(const char* name, T&& arg1) {
  cout << name << " : " << arg1 << endl;
}
template <typename T, typename... Args>
void trace(const char* names, T&& arg1, Args&&... args) {
  const char* comma = strchr(names + 1, ',');
  cout.write(names, comma - names) << " : " << arg1 << " | ";
  trace(comma + 1, args...);
}
long long fast(long long a, long long b, long long MOD) {
  long long ret = 1;
  while (b) {
    if (b & 1) ret = ret * a % MOD;
    a = a * a % MOD;
    b >>= 1;
  }
  return ret;
}
int rev(int num, int lg_n) {
  int res = 0;
  for (int i = 0; i < lg_n; ++i)
    if (num & (1 << i)) res |= 1 << (lg_n - 1 - i);
  return res;
}
void ntt(vector<long long>& a, bool invert, long long g, long long MOD) {
  int n = (int)a.size();
  int lg_n = 0;
  while ((1 << lg_n) < n) ++lg_n;
  for (int i = 0; i < n; ++i)
    if (i < rev(i, lg_n)) swap(a[i], a[rev(i, lg_n)]);
  long long inv = fast(g, MOD - 2, MOD);
  for (int len = 2; len <= n; len <<= 1) {
    long long wlen = invert ? inv : g;
    for (int i = len; i < (1 << 20); i <<= 1) wlen = wlen * wlen % MOD;
    for (int i = 0; i < n; i += len) {
      long long w = 1;
      for (int j = 0; j < len / 2; ++j) {
        long long u = a[i + j], v = a[i + j + len / 2] * w % MOD;
        a[i + j] = (u + v) % MOD;
        a[i + j + len / 2] = (u - v + MOD) % MOD;
        w = w * wlen % MOD;
      }
    }
  }
  if (invert) {
    long long term = fast(n, MOD - 2, MOD);
    for (int i = 0; i < n; ++i) a[i] = a[i] * term % MOD;
  }
}
const int K = 1 << 10;
void multiply(vector<long long>& a, vector<long long>& b,
              vector<long long>& res, long long MOD, long long g) {
  vector<long long> fa(a.begin(), a.end()), fb(b.begin(), b.end());
  size_t n = 1;
  while (n < max(a.size(), b.size())) n <<= 1;
  n <<= 1;
  fa.resize(n), fb.resize(n);
  ntt(fa, false, g, MOD), ntt(fb, false, g, MOD);
  for (size_t i = 0; i < n; ++i) fa[i] *= fb[i];
  ntt(fa, true, g, MOD);
  res.resize(K);
  for (size_t i = 0; i < K; ++i) res[i] = fa[i] % MOD;
}
const long long MOD = 7340033;
const int D = 31;
vector<long long> dp[D];
int main() {
  long long g = 5;
  for (int i = 1; i < D; i++) dp[i].resize(K, 0);
  dp[1][0] = 1;
  for (int i = 2; i < D; i++) {
    vector<long long> v1 = dp[i - 1];
    multiply(v1, v1, v1, MOD, g);
    multiply(v1, v1, v1, MOD, g);
    dp[i] = v1;
    dp[i].insert(dp[i].begin(), 1);
    dp[i].resize(K);
  }
  int q;
  cin >> q;
  while (q--) {
    int n, k;
    cin >> n >> k;
    if (n % 2 == 0) {
      cout << (k == 0) << '\n';
      continue;
    }
    int xx = n;
    int dep = 1;
    while (n > 1 and n % 2 == 1) {
      n >>= 1;
      dep++;
    }
    cout << dp[dep][k] << '\n';
  }
  return 0;
}
