#include <bits/stdc++.h>
using namespace std;
const int MAXK = 1 << 12;
const int P = 7340033;
const int G = 3;
const int MAXH = 30;
int dp[MAXH + 7][MAXK + 7], buff[MAXK + 7];
int qpow(int a, int b) {
  if (b == 0) return 1;
  if (a == 0) return 0;
  int aux = qpow(1LL * a * a % P, b >> 1);
  if (b & 1) aux = 1LL * aux * a % P;
  return aux;
}
inline int inv(int x) { return qpow(x, P - 2); }
void NTT(int *a, int N, int dir) {
  int t = 0;
  for (int i = (0); i <= (N - 1); ++i) {
    if (t < i) swap(a[t], a[i]);
    for (int j = (N >> 1); (t ^= j) < j; j >>= 1)
      ;
  }
  for (int i = 2; i <= N; i <<= 1) {
    int wn = qpow(G, (P - 1) / i);
    for (int j = 0; j < N; j += i) {
      int w = 1, t;
      for (int k = 0; k < (i >> 1); k++, w = 1LL * w * wn % P) {
        t = 1LL * w * a[j + k + (i >> 1)] % P;
        a[j + k + (i >> 1)] = a[j + k] - t;
        a[j + k] = a[j + k] + t;
        if (a[j + k + (i >> 1)] < 0) a[j + k + (i >> 1)] += P;
        if (a[j + k] >= P) a[j + k] -= P;
      }
    }
  }
  if (dir == -1) {
    for (int i = 1; i < (N >> 1); i++) swap(a[i], a[N - i]);
    int INV_N = inv(N);
    for (int i = (0); i <= (N - 1); ++i) a[i] = 1LL * a[i] * INV_N % P;
  }
}
void pre() {
  dp[0][0] = 1;
  for (int i = (1); i <= (MAXH); ++i) {
    memset(buff, 0, sizeof(buff));
    for (int j = (0); j <= (1000); ++j) buff[j] = dp[i - 1][j];
    NTT(buff, MAXK, 1);
    for (int j = (0); j <= (MAXK); ++j) buff[j] = qpow(buff[j], 4);
    NTT(buff, MAXK, -1);
    for (int j = (1); j <= (1000); ++j) dp[i][j] = buff[j - 1];
    dp[i][0] = 1;
  }
}
inline int height(int N) {
  int h = 0;
  while (N > 1 && N & 1) {
    ++h;
    N = (N - 1) >> 1;
  }
  return h;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  pre();
  int Q;
  cin >> Q;
  while (Q--) {
    int n, k;
    cin >> n >> k;
    cout << dp[height(n)][k] << '\n';
  }
  return 0;
}
