#include <bits/stdc++.h>
using namespace std;
const int N = 1 << 12;
const int K = 1007;
const int MOD = 7340033;
const double Pi = acos(-1.0);
void inc(int &x, int y) {
  x += y;
  if (x >= MOD) x -= MOD;
}
struct C {
  double r, i;
  C() { r = i = 0; }
  C(double _r, double _i) { r = _r, i = _i; }
  C operator+(const C &p) const { return C(r + p.r, i + p.i); }
  C operator-(const C &p) const { return C(r - p.r, i - p.i); }
  C operator*(const C &p) const {
    return C(r * p.r - i * p.i, r * p.i + i * p.r);
  }
};
inline C conj(const C &p) { return C(p.r, -p.i); }
C w[N];
int L, bitrev[N];
void init(int len) {
  L = 0;
  while (1 << L <= len) ++L;
  int n = 1 << L;
  for (int i = (0); i < (n); ++i)
    bitrev[i] = (bitrev[i >> 1] >> 1) | ((i & 1) << (L - 1));
  for (int i = (0); i < (n); ++i)
    w[i] = C(cos(2 * Pi * i / n), sin(2 * Pi * i / n));
}
void fft(C a[], const int &n) {
  for (int i = (0); i < (n); ++i)
    if (i < bitrev[i]) swap(a[i], a[bitrev[i]]);
  for (int i = 2, d = n >> 1; i <= n; i <<= 1, d >>= 1)
    for (int j = 0; j < n; j += i) {
      C *l = a + j, *r = a + j + (i >> 1), *p = w;
      for (int k = 0; k < (i >> 1); ++k) {
        C tmp = (*r) * (*p);
        *r = *l - tmp, *l = *l + tmp;
        ++l, ++r, p += d;
      }
    }
}
int n;
C A[N], B[N];
C dfa[N], dfb[N], dfc[N], dfd[N];
vector<int> gao(const vector<int> &a, const vector<int> &b) {
  init(((int)(a).size()) + ((int)(b).size()));
  int n = 1 << L;
  for (int i = (0); i < (n); ++i) A[i] = B[i] = C(0, 0);
  for (int i = (0); i < (((int)(a).size())); ++i)
    A[i] = C(a[i] & 32767, a[i] >> 15);
  for (int i = (0); i < (((int)(b).size())); ++i)
    B[i] = C(b[i] & 32767, b[i] >> 15);
  fft(A, n), fft(B, n);
  for (int i = (0); i < (n); ++i) {
    int j = (n - i) & (n - 1);
    static C da, db, dc, dd;
    da = (A[i] + conj(A[j])) * C(0.5, 0);
    db = (A[i] - conj(A[j])) * C(0, -0.5);
    dc = (B[i] + conj(B[j])) * C(0.5, 0);
    dd = (B[i] - conj(B[j])) * C(0, -0.5);
    dfa[j] = da * dc, dfb[j] = da * dd;
    dfc[j] = db * dc, dfd[j] = db * dd;
  }
  for (int i = (0); i < (n); ++i) {
    A[i] = dfa[i] + dfb[i] * C(0, 1);
    B[i] = dfc[i] + dfd[i] * C(0, 1);
  }
  fft(A, n), fft(B, n);
  vector<int> ret(n, 0);
  for (int i = (0); i < (n); ++i) {
    long long da = (long long)(A[i].r / n + 0.5) % MOD;
    long long db = (long long)(A[i].i / n + 0.5) % MOD;
    long long dc = (long long)(B[i].r / n + 0.5) % MOD;
    long long dd = (long long)(B[i].i / n + 0.5) % MOD;
    inc(ret[i], (da + ((db + dc) << 15) + (dd << 30)) % MOD);
  }
  return ret;
}
int h[30][K], f[30][K];
void prepare() {
  f[0][0] = 1;
  for (int i = (1); i < (30); ++i) {
    f[i][0] = 1;
    vector<int> a(K), b(K), c;
    for (int j = (0); j < (K); ++j) a[j] = b[j] = f[i - 1][j];
    c = gao(a, b);
    for (int j = (0); j < (min(K, ((int)(c).size()))); ++j) h[i][j] = c[j];
    for (int j = (0); j < (K); ++j) a[j] = b[j] = h[i][j];
    c = gao(a, b);
    for (int j = (0); j < (min(K - 1, ((int)(c).size()))); ++j)
      f[i][j + 1] = c[j];
  }
}
int get(int n) {
  int ret = 0;
  while (n & 1) ++ret, n >>= 1;
  return ret - !n;
}
int main() {
  prepare();
  int q;
  scanf("%d", &q);
  for (int _q = (0); _q < (q); ++_q) {
    int n, k;
    scanf("%d%d", &n, &k);
    printf("%d\n", f[get(n)][k]);
  }
  return 0;
}
