#include <bits/stdc++.h>
using namespace std;
const int Mod = 1e9 + 7;
const int N = 5e5 + 10;
long long l, r;
long long dp[16][1 << 16][16];
int a[N], cnt;
long long dfs(int cnt, int mask, int mx, bool limit) {
  if (cnt == 0) {
    if (mask & (1 << mx)) return 1;
    return 0;
  }
  if (!limit && dp[cnt][mask][mx] != -1) return dp[cnt][mask][mx];
  long long res = 0;
  if (limit) {
    for (int i = 0; i < a[cnt]; i++)
      res += dfs(cnt - 1, ((mask << 4) + i) % (1 << 16), max(mx, i), 0);
    res += dfs(cnt - 1, ((mask << 4) + a[cnt]) % (1 << 16), max(mx, a[cnt]), 1);
  } else {
    for (int i = 0; i < 16; i++)
      res += dfs(cnt - 1, ((mask << 4) + i) % (1 << 16), max(mx, i), 0);
  }
  if (!limit) dp[cnt][mask][mx] = res;
  return res;
}
long long cal(long long x) {
  if (x <= 0) return 0;
  cnt = 0;
  while (x) {
    a[++cnt] = x % 16;
    x /= 16;
  }
  long long res = 0;
  for (int i = 1; i < cnt; i++) {
    for (int j = 1; j < 16; j++) {
      res += dfs(i - 1, j, j, 0);
    }
  }
  for (int i = 1; i < a[cnt]; i++) res += dfs(cnt - 1, i, i, 0);
  res += dfs(cnt - 1, a[cnt], a[cnt], 1);
  return res;
}
int main() {
  memset(dp, -1, sizeof(dp));
  int q;
  scanf("%d", &q);
  while (q--) {
    scanf("%I64x %I64x", &l, &r);
    printf("%I64d\n", cal(r) - cal(l - 1));
  }
}
