#include <bits/stdc++.h>
using namespace std;
long long dp[16][16][16][2];
bool good(int cur, int wantmx, int cmx, bool ok, int ndig) {
  if (ndig > wantmx || (wantmx >= 4 * (cur + 1) && !ok)) {
    return false;
  }
  if (4 * cur <= wantmx && wantmx < 4 * (cur + 1) &&
      (ndig & (1 << (wantmx % 4))) == 0) {
    return false;
  }
  return true;
}
long long getdp(int cur, int wantmx, int cmx, bool ok) {
  if (cur == -1) {
    return wantmx == cmx;
  }
  long long &ref = dp[cur][wantmx][cmx][ok];
  if (ref != -1) {
    return ref;
  }
  ref = 0;
  for (int i = 0; i <= wantmx; i++) {
    if (good(cur, wantmx, cmx, ok, i)) {
      ref += getdp(cur - 1, wantmx, max(cmx, i),
                   (ok || (4 * cur <= wantmx && wantmx < 4 * (cur + 1))));
    }
  }
  return ref;
}
long long solve(long long x) {
  vector<int> vdig;
  for (; x; x >>= 4) {
    vdig.push_back(x & 15);
  }
  long long ans = 0;
  for (int cur = 0; cur + 1 < vdig.size(); cur++) {
    for (int wantmx = 0; wantmx < 16; wantmx++) {
      for (int dig = 1; dig < 16; dig++) {
        if (good(cur, wantmx, 0, 0, dig)) {
          ans += getdp(cur - 1, wantmx, dig,
                       (4 * cur <= wantmx && wantmx < 4 * (cur + 1)));
        }
      }
    }
  }
  for (int wantmx = 0; wantmx < 16; wantmx++) {
    bool ok = false;
    int cmx = 0;
    for (int cur = vdig.size() - 1; cur >= 0; cur--) {
      for (int dig = (cur + 1 == vdig.size()); dig < vdig[cur]; dig++) {
        if (good(cur, wantmx, cmx, ok, dig)) {
          ans += getdp(cur - 1, wantmx, max(cmx, dig),
                       (ok || (4 * cur <= wantmx && wantmx < 4 * (cur + 1))));
        }
      }
      if (!good(cur, wantmx, cmx, ok, vdig[cur])) {
        break;
      }
      cmx = max(cmx, vdig[cur]);
      ok |= (4 * cur <= wantmx && wantmx < 4 * (cur + 1));
    }
  }
  return ans;
}
int main() {
  memset(dp, -1, sizeof(dp));
  int nq;
  for (scanf("%d", &nq); nq--;) {
    long long lt, rt;
    scanf("%llx %llx", &lt, &rt);
    printf("%lld\n", solve(rt + 1) - solve(lt));
  }
}
