#include <bits/stdc++.h>
using namespace std;
int a[22];
long long f[17][17][2][2];
inline void upd(long long& x, long long y) { x += y; }
void init(char* s) {
  memset(a, 0, sizeof(a));
  memset(f, 0, sizeof(f));
  int n = strlen(s + 1);
  for (int i = 1; i <= n; i++)
    a[i] = (s[i] >= '0' && s[i] <= '9') ? s[i] - '0' : (s[i] - 'a' + 10);
  for (int i = 1; i <= n / 2; i++) swap(a[i], a[n - i + 1]);
}
long long solve(char* s) {
  init(s);
  int n = strlen(s + 1);
  long long ans = 0;
  for (int i = 0; i <= 15; i++) f[0][i][0][0] = 1;
  for (int i = 0; i <= 14; i++) {
    for (int mx = 0; mx <= 15; mx++) {
      int in = 0;
      if (mx < 4 * (i + 1) && mx >= 4 * i) in = (1 << (mx - 4 * i));
      for (int been = 0; been <= 1; been++) {
        long long tmp_0 = f[i][mx][been][0];
        long long tmp_1 = f[i][mx][been][1];
        if (!tmp_0 && !tmp_1) continue;
        for (int ne = 0; ne <= mx; ne++) {
          if (in && !(ne & in)) continue;
          int op = 0;
          if (ne == mx) op = 1;
          long long& goal0 = f[i + 1][mx][op | been][0];
          long long& goal1 = f[i + 1][mx][op | been][1];
          upd(goal0, tmp_0);
          if (ne < a[i + 1]) {
            upd(goal1, tmp_0);
          } else if (ne == a[i + 1]) {
            upd(goal1, tmp_1);
          }
        }
      }
    }
  }
  for (int i = 0; i <= 15; i++) upd(ans, f[15][i][1][1]);
  return ans;
}
int pan(char* s) {
  init(s);
  int n = strlen(s + 1);
  int mx = 0;
  for (int i = 1; i <= n; i++) mx = max(mx, a[i]);
  for (int i = 1; i <= n; i++)
    if (mx < 4 * i && mx >= 4 * (i - 1)) {
      int in = (1 << (mx - 4 * (i - 1)));
      if (!(a[i] & in))
        return 0;
      else
        return 1;
    }
  return 0;
}
char s1[22], s2[33];
int T;
int main() {
  scanf("%d", &T);
  while (T--) {
    scanf("%s%s", s1 + 1, s2 + 1);
    long long ans1 = solve(s1);
    long long ans2 = solve(s2);
    int ok = pan(s2);
    printf("%I64d\n", ans2 - ans1 + ok);
  }
}
