#include <bits/stdc++.h>
using LL = long long;
std::vector<int> L, R;
LL cache[20][16][2][2];
LL calc(int at, bool samel, bool samer, int maxc, bool contain_maxc,
        bool set_maxc) {
  if (at == -1) {
    return contain_maxc && set_maxc;
  }
  bool use_cache = !samel && !samer;
  if (use_cache) {
    if (cache[at][maxc][contain_maxc][set_maxc] != -1)
      return cache[at][maxc][contain_maxc][set_maxc];
  }
  LL ret = 0;
  for (int c = 0; c <= maxc; ++c) {
    if (samel && c < L[at]) continue;
    if (samer && c > R[at]) continue;
    bool new_set_maxc = set_maxc;
    if (maxc >= at * 4 && maxc < (at + 1) * 4) {
      if (~c >> (maxc - at * 4) & 1) continue;
      new_set_maxc = true;
    }
    ret += calc(at - 1, samel && c == L[at], samer && c == R[at], maxc,
                contain_maxc || c == maxc, new_set_maxc);
  }
  if (use_cache) {
    cache[at][maxc][contain_maxc][set_maxc] = ret;
  }
  return ret;
}
LL solve() {
  LL ret = 0;
  for (int maxc = 1; maxc <= 15; ++maxc) {
    ret += calc((int)R.size() - 1, true, true, maxc, false, false);
  }
  return ret;
}
int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  std::istream& reader = std::cin;
  memset(cache, -1, sizeof(cache));
  int cas;
  reader >> cas;
  while (cas--) {
    auto parse_hex = [&]() {
      std::string s;
      reader >> s;
      std::vector<int> vec(s.length());
      for (int i = 0; i < s.length(); ++i) {
        vec[s.length() - 1 - i] =
            s[i] >= '0' && s[i] <= '9' ? s[i] - '0' : s[i] - 'a' + 10;
      }
      return vec;
    };
    L = parse_hex();
    R = parse_hex();
    L.resize(R.size(), 0);
    std::cout << solve() << std::endl;
  }
}
