#include <bits/stdc++.h>
using namespace std;
const int LOGN = 35;
const int K = 1111;
const int mod = 7340033;
const double pi = acos(-1.0);
const int root = 5;
const int root_1 = 4404020;
const int root_pw = 1 << 20;
vector<int> dp[LOGN];
int add(int a, int b) { return (a + b) % mod; }
int sub(int a, int b) { return (a - b + mod) % mod; }
int mul(int a, int b) { return (long long)a * b % mod; }
int power(int n, int e) {
  int ret = 1, res = n;
  while (e) {
    if (e & 1) ret = mul(ret, res);
    res = mul(res, res);
    e >>= 1;
  }
  return ret;
}
int inv(int x) { return power(x, mod - 2); }
namespace fft {
void dft(vector<int>& a, bool invert) {
  int n = (int)a.size();
  if (n == 1) {
    a[0] %= mod;
    return;
  }
  vector<int> a0(n / 2), a1(n / 2);
  for (int i = 0, j = 0; i < n; i += 2, j++) {
    a0[j] = a[i];
    a1[j] = a[i + 1];
  }
  dft(a0, invert);
  dft(a1, invert);
  int wlen = invert ? root_1 : root;
  for (int i = n; i < root_pw; i *= 2) {
    wlen = mul(wlen, wlen);
  }
  int w = 1;
  for (int i = 0; i < n / 2; i++) {
    a[i] = add(a0[i], mul(a1[i], w));
    a[i + n / 2] = sub(a0[i], mul(a1[i], w));
    if (invert) {
      a[i] = mul(a[i], 3670017);
      a[i + n / 2] = mul(a[i + n / 2], 3670017);
    }
    w = mul(w, wlen);
  }
}
int rev(int n, int logn) {
  int ret = 0;
  for (int i = logn - 1; i >= 0; i--) {
    if (n & (1 << i)) {
      ret |= 1 << (logn - i - 1);
    }
  }
  return ret;
}
void iterative_dft(vector<int>& a, bool invert) {
  int logn = 0;
  int n = (int)a.size();
  while ((1 << logn) < n) {
    logn++;
  }
  for (int i = 0; i < n; i++) {
    int j = rev(i, logn);
    if (i < j) {
      swap(a[i], a[j]);
    }
  }
  for (int len = 2; len <= n; len *= 2) {
    int wlen = invert ? root_1 : root;
    for (int i = len; i < root_pw; i *= 2) {
      wlen = mul(wlen, wlen);
    }
    for (int i = 0; i < n; i += len) {
      int w = 1;
      for (int j = 0; j < len / 2; j++) {
        int u = a[i + j];
        int v = mul(w, a[i + j + len / 2]);
        a[i + j] = add(u, v);
        a[i + j + len / 2] = sub(u, v);
        w = mul(w, wlen);
      }
    }
  }
  if (invert) {
    int inverse = inv(n);
    for (int i = 0; i < n; i++) {
      a[i] = mul(a[i], inverse);
    }
  }
}
vector<int> multiply(const vector<int>& a, const vector<int>& b) {
  vector<int> fa(a.begin(), a.end());
  vector<int> fb(b.begin(), b.end());
  for (auto& it : fa) {
    it %= mod;
  }
  for (auto& it : fb) {
    it %= mod;
  }
  int n = 1;
  while (n < max((int)fa.size(), (int)fb.size())) {
    n *= 2;
  }
  n *= 2;
  fa.resize(n);
  fb.resize(n);
  iterative_dft(fa, false);
  iterative_dft(fb, false);
  for (int i = 0; i < n; i++) {
    fa[i] = mul(fa[i], fb[i]);
  }
  iterative_dft(fa, true);
  fa.resize(min(1 << 12, n));
  return fa;
}
};  // namespace fft
int main() {
  for (int i = 0; i < LOGN; i++) {
    dp[i].resize(K);
  }
  dp[0][0] = 1;
  for (int i = 0; i < LOGN - 1; i++) {
    dp[i + 1] = fft::multiply(dp[i], dp[i]);
    dp[i + 1] = fft::multiply(dp[i + 1], dp[i + 1]);
    dp[i + 1].insert(dp[i + 1].begin(), 1);
  }
  int q;
  scanf("%d", &q);
  while (q--) {
    int n, k;
    scanf("%d %d", &n, &k);
    int w = 0;
    while (n > 1 && n % 2 == 1) {
      w++;
      n /= 2;
    }
    printf("%d\n", dp[w][k]);
  }
  return 0;
}
