#include <bits/stdc++.h>
using namespace std;
const int M = 30;
const int N = 1000 + 10;
const int mod = 7340033;
const long long root = 5;
const long long root_1 = 4404020;
const long long root_pw = 1 << 20;
long long Rev[mod + 10];
vector<long long> Dp[M + 2];
void LiczRev() {
  int i;
  Rev[1] = 1;
  for (i = 2; i < mod; i++)
    Rev[i] = (mod - ((mod / i) * Rev[mod % i]) % mod) % mod;
}
long long Moduluj(long long v, long long mod) { return (v + 2 * mod) % mod; }
void NTT(vector<long long> &a, bool invert) {
  long long wlen, w, u, v, nrev;
  int n, i, len, bit, j;
  n = (int)a.size();
  for (i = 1, j = 0; i < n; ++i) {
    bit = n >> 1;
    for (; j >= bit; bit >>= 1) j -= bit;
    j += bit;
    if (i < j) swap(a[i], a[j]);
  }
  for (len = 2; len <= n; len <<= 1) {
    wlen = invert ? root_1 : root;
    for (i = len; i < root_pw; i <<= 1) wlen = (wlen * wlen) % mod;
    for (i = 0; i < n; i += len) {
      w = 1;
      for (j = 0; j < len / 2; ++j) {
        u = a[i + j];
        v = (a[i + j + len / 2] * w) % mod;
        a[i + j] = Moduluj(u + v, mod);
        a[i + j + len / 2] = Moduluj(u - v, mod);
        w = (w * wlen) % mod;
      }
    }
  }
  if (invert) {
    nrev = Rev[n];
    for (i = 0; i < n; ++i) a[i] = (a[i] * nrev) % mod;
  }
}
void Mnoz(vector<long long> &A, vector<long long> &B, vector<long long> &Res) {
  int n, i;
  vector<long long> WA, WB;
  WA = A;
  WB = B;
  n = 1;
  while (n < max((int)WA.size(), (int)WB.size())) n <<= 1;
  n <<= 1;
  WA.resize(n);
  WB.resize(n);
  NTT(WA, false);
  NTT(WB, false);
  for (i = 0; i < WA.size(); i++) WA[i] = (WA[i] * WB[i]) % mod;
  NTT(WA, true);
  Res.resize(n);
  for (i = 0; i < WA.size(); i++) Res[i] = WA[i] % mod;
}
void Inicjuj() {
  int i;
  vector<long long> D;
  for (i = 0; i <= M; i++) Dp[i].resize(N + 4);
  for (i = 0; i <= M; i++) {
    Dp[i][0] = 1;
    Mnoz(Dp[i], Dp[i], D);
    D.resize(N);
    Mnoz(D, D, Dp[i + 1]);
    Dp[i + 1].insert(Dp[i + 1].begin(), 0);
    Dp[i + 1].resize(N);
  }
}
int main() {
  int q, i;
  int n, k, height;
  LiczRev();
  Inicjuj();
  scanf("%d", &q);
  for (i = 0; i < q; i++) {
    scanf("%d%d", &n, &k);
    height = 0;
    while (n > 1 && n & 1) {
      height++;
      n >>= 1;
    }
    printf("%d\n", (int)Dp[height][k]);
  }
  return 0;
}
