#include <bits/stdc++.h>
using namespace std;
long long int dp[2][16];
int a[20];
int high;
int idx(char c) {
  if (c >= '0' && c <= '9') return c - '0';
  return c - 'a' + 10;
}
long long int dfs(int pos, int state, bool lead, bool limit) {
  if (pos == -1) return state;
  if (!limit && !lead && dp[state][pos] != -1) return dp[state][pos];
  int up = limit ? a[pos] : 15;
  up = min(up, high);
  long long int ans = 0;
  for (int i = 0; i <= up; i++) {
    if ((pos << 2) == ((high >> 2) << 2) && !(i >> (high % 4) & 1)) continue;
    int nstate = state;
    if ((lead && i == 0) == 0) {
      if (i == high) nstate = 1;
    }
    ans += dfs(pos - 1, nstate, lead && i == 0, limit && i == a[pos]);
  }
  if (!limit && !lead) dp[state][pos] = ans;
  return ans;
}
long long int work(long long int t) {
  if (t <= 0) return 0;
  int cnt = 0;
  while (t) {
    a[cnt++] = t % 16;
    t >>= 4;
  }
  long long int ans = 0;
  for (high = 4; high < min(16, cnt * 4); high++) {
    memset(dp, -1, sizeof(dp));
    ans += dfs(cnt - 1, 0, 1, 1);
  }
  return ans;
}
long long int px[16];
int main() {
  px[0] = 1;
  for (int i = 1; i < 16; i++) px[i] = px[i - 1] * 16;
  int T;
  scanf("%d", &T);
  while (T--) {
    long long int l = 0, r = 0;
    char L[20], R[20];
    scanf("%s%s", L, R);
    int lz = strlen(L), rr = strlen(R);
    for (int i = lz - 1; i >= 0; i--) l += idx(L[i]) * px[lz - 1 - i];
    for (int i = rr - 1; i >= 0; i--) r += idx(R[i]) * px[rr - 1 - i];
    printf("%lld\n", work(r) - work(l - 1));
  }
  return 0;
}
