#include <bits/stdc++.h>
int ar[16];
char A[100], B[100];
long long dp[16][16][1 << 16];
long long F(int n, int m, int mask) {
  if (n == 0) return (mask & (1 << m)) ? 1 : 0;
  if (dp[n][m][mask] != -1) return dp[n][m][mask];
  int d, nmask;
  long long res = 0;
  for (d = 0; d <= 15; d++) {
    nmask = mask;
    if (n <= 4) nmask |= (d << ((n - 1) * 4));
    res += F(n - 1, (d > m) ? d : m, nmask);
  }
  return (dp[n][m][mask] = res);
}
long long dfs(int i, int m, int mask) {
  if (i == 16) return F(0, m, mask);
  long long res = 0;
  int d, k = 16 - i, nmask = 0;
  for (d = 0; d < ar[i]; d++) {
    nmask = mask;
    if (k <= 4) nmask |= (d << ((k - 1) * 4));
    res += F(16 - i - 1, (d > m) ? d : m, nmask);
  }
  nmask = mask;
  if (k <= 4) nmask |= (d << ((k - 1) * 4));
  res += dfs(i + 1, (d > m) ? d : m, nmask);
  return res;
}
long long solve(long long v) {
  if (v <= 0) return 0;
  int i, j;
  for (i = 15; i >= 0; i--) {
    ar[i] = v & 15;
    v >>= 4;
  }
  return dfs(0, 0, 0);
}
long long convert(const char* str) {
  int d, x;
  long long h = 0;
  for (d = 0; str[d]; d++) {
    x = (str[d] >= 48 && str[d] <= 57) ? str[d] - 48 : str[d] - 97 + 10;
    h = (h << 4) | x;
  }
  return h;
}
int main() {
  int t, i, j, k;
  memset(dp, -1, sizeof(dp));
  scanf("%d", &t);
  while (t--) {
    scanf("%s %s", A, B);
    long long a = convert(A);
    long long b = convert(B);
    printf("%lld\n", solve(b) - solve(--a));
  }
  return 0;
}
