#include <bits/stdc++.h>
long long dp[(16)][(1 << (16)) + 10][(16)];
long long getdp(long long u, long long v, long long w) {
  if (~dp[u][v][w]) {
    return dp[u][v][w];
  }
  if (!w) {
    if ((v >> u) & 1) {
      return dp[u][v][w] = 1;
    } else {
      return dp[u][v][w] = 0;
    }
  }
  long long j = 0;
  for (long long i = 0; i < 16; ++i) {
    j += getdp(std::max(u, i), ((v << 4) + i) % (1 << 16), w - 1);
  }
  return dp[u][v][w] = j;
}
long long gethex() {
  char str[(16)];
  scanf("%s", str);
  long long ret = 0;
  int n = strlen(str);
  for (int i = 0; i < n; ++i) {
    if (isdigit(str[i])) {
      ret = (ret << 4) + str[i] - '0';
    } else {
      ret = (ret << 4) + str[i] - 'a' + 10;
    }
  }
  return ret;
}
long long getans(long long x) {
  if (x <= 0) return 0;
  long long b[(16)], n = 0;
  while (x) {
    b[n++] = x % 16;
    x >>= 4;
  }
  long long ret = 0, u = 0, v = 0;
  for (int w = n - 1; w >= 0; --w) {
    for (long long i = 0; i < b[w]; ++i) {
      ret += dp[std::max(u, i)][((v << 4) + i) % (1 << 16)][w];
    }
    u = std::max(u, b[w]);
    v = ((v << 4) + b[w]) % (1 << 16);
  }
  ret += dp[u][v][0];
  return ret;
}
int main() {
  int q;
  scanf("%d", &q);
  memset(dp, -1, sizeof dp);
  getdp(0, 0, 15);
  while (q--) {
    long long l = gethex(), r = gethex();
    printf("%I64d\n", getans(r) - getans(l - 1));
  }
  return 0;
}
