#include <bits/stdc++.h>
using namespace std;
bool SR(int &_x) { return scanf("%d", &_x) == 1; }
bool SR(long long &_x) { return scanf("%lld", &_x) == 1; }
bool SR(double &_x) { return scanf("%lf", &_x) == 1; }
bool SR(char *_s) { return scanf("%s", _s) == 1; }
bool RI() { return true; }
template <typename I, typename... T>
bool RI(I &_x, T &..._tail) {
  return SR(_x) && RI(_tail...);
}
void SP(const int _x) { printf("%d", _x); }
void SP(const long long _x) { printf("%lld", _x); }
void SP(const double _x) { printf("%.16lf", _x); }
void SP(const char *s) { printf("%s", s); }
void PL() { puts(""); }
template <typename I, typename... T>
void PL(const I _x, const T... _tail) {
  SP(_x);
  if (sizeof...(_tail)) putchar(' ');
  PL(_tail...);
}
int dig[16];
long long mem[16][2][16];
long long dp(int pos, bool any, int hi) {
  long long &ans = mem[pos][any][hi];
  if (~ans) return ans;
  if (pos == 0) return ans = (any || hi <= dig[pos]);
  ans = 0;
  for (int i = (0); i <= int(min(any ? 15 : dig[pos], hi)); i++) {
    const bool sa = any || i < dig[pos];
    ans += dp(pos - 1, sa, hi);
    if (i == hi)
      for (int j = 0; j < int(hi); j++) ans += dp(pos - 1, sa, j);
  }
  return ans;
}
int isgood[16][1 << 16];
void predo() {
  static int tmp[1 << 16];
  for (int i = 0; i < int(1 << 16); i++) tmp[i] = max(tmp[i / 16], i % 16);
  for (int i = 0; i < int(16); i++)
    for (int j = 0; j < int(1 << 16); j++)
      if (j & (1 << max(tmp[j], i))) isgood[i][j] = 1;
  for (int i = 0; i < int(16); i++)
    for (int j = (1); j <= int((1 << 16) - 1); j++)
      isgood[i][j] += isgood[i][j - 1];
  for (int i = 0; i < int(16); i++)
    ;
}
vector<long long> upper(const long long &x) {
  vector<long long> ret(16, 0);
  if (x == 0) {
    ret[0]++;
    return ret;
  }
  memset(mem, -1, sizeof(mem));
  int len = 0;
  for (auto y = x; y; y /= 16) dig[len++] = y % 16;
  for (int i = 0; i < int(16); i++) ret[i] = dp(len - 1, 0, i);
  return ret;
}
long long calc(const long long &x) {
  if (x == 0) return 0;
  ;
  long long ans = 0;
  auto cnt = upper(x / (1 << 16));
  for (int i = 0; i < int(16); i++) ans += cnt[i] * isgood[i][(1 << 16) - 1];
  ;
  int hi = 0;
  for (auto y = x / (1 << 16); y; y /= 16) hi = max(1LL * hi, y % 16);
  ans -= isgood[hi][(1 << 16) - 1];
  ans += isgood[hi][x % (1 << 16)];
  return ans;
}
long long cnt2(const long long &l, const long long &r) {
  long long ans = 0;
  for (long long i = l; i <= r; i++) {
    long long hi = 0;
    for (long long j = i; j; j /= 16) hi = max(hi, j % 16);
    if (i & (1 << hi)) ans++;
  }
  return ans;
}
int main() {
  predo();
  int t;
  RI(t);
  while (t--) {
    long long l, r;
    scanf("%llx %llx", &l, &r);
    long long ans = calc(r);
    ans -= calc(l - 1);
    PL(ans);
  }
  return 0;
}
