#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
vector<int> digit;
vector<int> getDigit(ll X) {
vector<int> ans;
for (; X > 0; X /= 10) ans.push_back(X % 10);
return ans;
}
ll memo[19][2][172];
// Số lượng số thoả mãn phần còn lại có tổng các chữ số = sum_digit
// khi phần prefix ở trước vị trí idx mang theo điều kiện smaller
ll dp(int idx, bool smaller, int sum_digit) {
if (idx == -1) return (sum_digit == 0);
ll& ans = memo[idx][smaller][sum_digit];
if (ans != -1) return ans;
ans = 0;
int max_digit = (smaller) ? 9 : digit[idx];
for (int i = 0; i <= max_digit; i++) {
if (sum_digit - i >= 0) {
ans += dp(idx - 1, smaller | (i < digit[idx]), sum_digit - i);
}
}
return ans;
}
// Số lượng số <= X mà có tổng các chữ số = sum_digit
ll solve(ll X, int sum_digit) {
digit = getDigit(X);
memset(memo, -1, sizeof memo);
return dp(digit.size() - 1, 0, sum_digit);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T; cin >> T;
while (T--) {
ll X, Y;
cin >> X >> Y;
ll ans = 0;
for (int sum_digit = 1; sum_digit <= 171; sum_digit++) {
ll L = (X + sum_digit - 1) / sum_digit;
ll R = Y / sum_digit;
ans += solve(R, sum_digit) - solve(L - 1, sum_digit);
}
cout << ans << '\n';
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKdmVjdG9yPGludD4gZGlnaXQ7IAoKdmVjdG9yPGludD4gZ2V0RGlnaXQobGwgWCkgewoJdmVjdG9yPGludD4gYW5zOyAKCWZvciAoOyBYID4gMDsgWCAvPSAxMCkgYW5zLnB1c2hfYmFjayhYICUgMTApOyAKCXJldHVybiBhbnM7IAp9CgpsbCBtZW1vWzE5XVsyXVsxNzJdOyAKCi8vIFPhu5EgbMaw4bujbmcgc+G7kSB0aG/huqMgbcOjbiBwaOG6p24gY8OybiBs4bqhaSBjw7MgdOG7lW5nIGPDoWMgY2jhu68gc+G7kSA9IHN1bV9kaWdpdAovLyBraGkgcGjhuqduIHByZWZpeCDhu58gdHLGsOG7m2MgduG7iyB0csOtIGlkeCBtYW5nIHRoZW8gxJFp4buBdSBraeG7h24gc21hbGxlcgpsbCBkcChpbnQgaWR4LCBib29sIHNtYWxsZXIsIGludCBzdW1fZGlnaXQpIHsKCWlmIChpZHggPT0gLTEpIHJldHVybiAoc3VtX2RpZ2l0ID09IDApOwoKCWxsJiBhbnMgPSBtZW1vW2lkeF1bc21hbGxlcl1bc3VtX2RpZ2l0XTsgCglpZiAoYW5zICE9IC0xKSByZXR1cm4gYW5zOyAKCglhbnMgPSAwOyAgCglpbnQgbWF4X2RpZ2l0ID0gKHNtYWxsZXIpID8gOSA6IGRpZ2l0W2lkeF07IAoJZm9yIChpbnQgaSA9IDA7IGkgPD0gbWF4X2RpZ2l0OyBpKyspIHsKCQlpZiAoc3VtX2RpZ2l0IC0gaSA+PSAwKSB7CgkJCWFucyArPSBkcChpZHggLSAxLCBzbWFsbGVyIHwgKGkgPCBkaWdpdFtpZHhdKSwgc3VtX2RpZ2l0IC0gaSk7IAoJCX0KCX0KCglyZXR1cm4gYW5zOyAKfQoKLy8gU+G7kSBsxrDhu6NuZyBz4buRIDw9IFggbcOgIGPDsyB04buVbmcgY8OhYyBjaOG7ryBz4buRID0gc3VtX2RpZ2l0CmxsIHNvbHZlKGxsIFgsIGludCBzdW1fZGlnaXQpIHsKCWRpZ2l0ID0gZ2V0RGlnaXQoWCk7CgltZW1zZXQobWVtbywgLTEsIHNpemVvZiBtZW1vKTsgCglyZXR1cm4gZHAoZGlnaXQuc2l6ZSgpIC0gMSwgMCwgc3VtX2RpZ2l0KTsgCn0KCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAkKCWludCBUOyBjaW4gPj4gVDsgCgl3aGlsZSAoVC0tKSB7CgkJbGwgWCwgWTsgCgkJY2luID4+IFggPj4gWTsgCgoJCWxsIGFucyA9IDA7IAoJCWZvciAoaW50IHN1bV9kaWdpdCA9IDE7IHN1bV9kaWdpdCA8PSAxNzE7IHN1bV9kaWdpdCsrKSB7CgkJCWxsIEwgPSAoWCArIHN1bV9kaWdpdCAtIDEpIC8gc3VtX2RpZ2l0OyAKCQkJbGwgUiA9IFkgLyBzdW1fZGlnaXQ7IAoJCQlhbnMgKz0gc29sdmUoUiwgc3VtX2RpZ2l0KSAtIHNvbHZlKEwgLSAxLCBzdW1fZGlnaXQpOyAKCQl9IAoKCQljb3V0IDw8IGFucyA8PCAnXG4nOyAKCX0KfQ==