// عَجَبًا لأَمْرِ المُؤْمِنِ، إنَّ أمْرَهُ كُلَّهُ خَيْرٌ
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
const char el = '\n';
const int N = 646646, M = 998244353, DIGITS = 12;
ll fp(ll b, ll p) {
if (!p) return 1;
ll res = fp(b, p >> 1);
return res * res % M * (p & 1 ? b % M : 1) % M;
}
int mp1[N], mp2[1 << (10 + DIGITS)];
vector<int> freq(int c) {
vector<int> f(10);
if (!c) return f;
int x = 0;
for (int i = 10 + DIGITS - 1; i >= 0; i--) {
if ((c >> i & 1) == 0) {
x++;
} else if (x < 10) f[x]++;
}
return f;
}
int val(vector<int> &f) {
int x = DIGITS, res = 0;
for (int &i: f) {
res <<= i + 1;
res |= (1 << i) - 1;
x -= i;
}
res = (res << (x + 1)) | ((1 << x) - 1);
return res;
}
ll fact[15], ones[15], inv[15];
string n;
ll dp[DIGITS + 1][N][2];
int vis[DIGITS + 1][N][2], id;
ll f(int i, int c, bool ls) {
auto &ans = dp[i][c][ls];
auto &vid = vis[i][c][ls];
if ((ls && vid) || vid == id) return ans;
vid = id, ans = 0;
auto ff = freq(mp1[c]);
if (i == DIGITS) {
int cnt = 0;
for (int x = 0; x < 10; x++)
ans += x * ff[x], cnt += ff[x];
ans = ans % M * ones[cnt] % M * fact[cnt - 1] % M;
for (auto &x: ff)
ans = ans * inv[x] % M;
return ans;
}
for (int x = 0; x <= (ls ? 9 : n[i] - '0'); x++) {
if (c || x) ff[x]++;
int cc = mp2[val(ff)];
ans = (ans + f(i + 1, cc, ls || x < n[i] - '0')) % M;
if (c || x) ff[x]--;
}
return ans;
}
int getN() {
int c = 0;
string p = string(10, '0') + string(DIGITS, '1');
while (next_permutation(p.begin(), p.end())) c++;
return c;
}
signed main() {
cin.tie(0)->sync_with_stdio(0);
#if Mosaab
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
// return cout << getN(), 0;
fact[0] = 1;
for (int i = 1; i < 15; i++) {
fact[i] = fact[i - 1] * i % M;
ones[i] = (ones[i - 1] * 10 + 1) % M;
}
inv[14] = fp(fact[14], M - 2);
for (int i = 14; i > 0; i--) {
inv[i - 1] = inv[i] * i % M;
}
string p = string(10, '0') + string(DIGITS, '1');
for (int i = 0; i < N; i++) {
int x = bitset<DIGITS + 10>(p).to_ulong();
mp1[i] = x, mp2[x] = i;
next_permutation(p.begin(), p.end());
}
int t;
cin >> t;
vector<pair<ll, ll> > a(t);
map<ll, ll> ans;
for (auto &[l,r]: a) {
cin >> l >> r;
ans[r], ans[l - 1];
}
for (auto &[i,j]: ans) {
n = to_string(i);
if (n.size() < DIGITS)
n = string(DIGITS - n.size(), '0') + n;
id++, j = f(0, 0, 0);
}
for (auto &[l,r]: a) {
cout << (ans[r] - ans[l - 1] + M) % M << el;
}
}
Ly8g2LnZjtis2Y7YqNmL2Kcg2YTYo9mO2YXZktix2ZAg2KfZhNmF2Y/YpNmS2YXZkNmG2ZDYjCDYpdmG2ZHZjiDYo9mF2ZLYsdmO2YfZjyDZg9mP2YTZkdmO2YfZjyDYrtmO2YrZktix2YwKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxsID0gbG9uZyBsb25nOwp1c2luZyBsZCA9IGxvbmcgZG91YmxlOwpjb25zdCBjaGFyIGVsID0gJ1xuJzsKIApjb25zdCBpbnQgTiA9IDY0NjY0NiwgTSA9IDk5ODI0NDM1MywgRElHSVRTID0gMTI7CiAKbGwgZnAobGwgYiwgbGwgcCkgewoJaWYgKCFwKSByZXR1cm4gMTsKCWxsIHJlcyA9IGZwKGIsIHAgPj4gMSk7CglyZXR1cm4gcmVzICogcmVzICUgTSAqIChwICYgMSA/IGIgJSBNIDogMSkgJSBNOwp9CiAKaW50IG1wMVtOXSwgbXAyWzEgPDwgKDEwICsgRElHSVRTKV07CiAKdmVjdG9yPGludD4gZnJlcShpbnQgYykgewoJdmVjdG9yPGludD4gZigxMCk7CglpZiAoIWMpIHJldHVybiBmOwoJaW50IHggPSAwOwoJZm9yIChpbnQgaSA9IDEwICsgRElHSVRTIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQlpZiAoKGMgPj4gaSAmIDEpID09IDApIHsKCQkJeCsrOwoJCX0gZWxzZSBpZiAoeCA8IDEwKSBmW3hdKys7Cgl9CglyZXR1cm4gZjsKfQogCmludCB2YWwodmVjdG9yPGludD4gJmYpIHsKCWludCB4ID0gRElHSVRTLCByZXMgPSAwOwoJZm9yIChpbnQgJmk6IGYpIHsKCQlyZXMgPDw9IGkgKyAxOwoJCXJlcyB8PSAoMSA8PCBpKSAtIDE7CgkJeCAtPSBpOwoJfQoJcmVzID0gKHJlcyA8PCAoeCArIDEpKSB8ICgoMSA8PCB4KSAtIDEpOwoJcmV0dXJuIHJlczsKfQogCmxsIGZhY3RbMTVdLCBvbmVzWzE1XSwgaW52WzE1XTsKc3RyaW5nIG47CmxsIGRwW0RJR0lUUyArIDFdW05dWzJdOwppbnQgdmlzW0RJR0lUUyArIDFdW05dWzJdLCBpZDsKIAogCmxsIGYoaW50IGksIGludCBjLCBib29sIGxzKSB7CglhdXRvICZhbnMgPSBkcFtpXVtjXVtsc107CglhdXRvICZ2aWQgPSB2aXNbaV1bY11bbHNdOwoJaWYgKChscyAmJiB2aWQpIHx8IHZpZCA9PSBpZCkgcmV0dXJuIGFuczsKCXZpZCA9IGlkLCBhbnMgPSAwOwoJYXV0byBmZiA9IGZyZXEobXAxW2NdKTsKCWlmIChpID09IERJR0lUUykgewoJCWludCBjbnQgPSAwOwoJCWZvciAoaW50IHggPSAwOyB4IDwgMTA7IHgrKykKCQkJYW5zICs9IHggKiBmZlt4XSwgY250ICs9IGZmW3hdOwoJCWFucyA9IGFucyAlIE0gKiBvbmVzW2NudF0gJSBNICogZmFjdFtjbnQgLSAxXSAlIE07CgkJZm9yIChhdXRvICZ4OiBmZikKCQkJYW5zID0gYW5zICogaW52W3hdICUgTTsKCQlyZXR1cm4gYW5zOwoJfQoJZm9yIChpbnQgeCA9IDA7IHggPD0gKGxzID8gOSA6IG5baV0gLSAnMCcpOyB4KyspIHsKCQlpZiAoYyB8fCB4KSBmZlt4XSsrOwoJCWludCBjYyA9IG1wMlt2YWwoZmYpXTsKCQlhbnMgPSAoYW5zICsgZihpICsgMSwgY2MsIGxzIHx8IHggPCBuW2ldIC0gJzAnKSkgJSBNOwoJCWlmIChjIHx8IHgpIGZmW3hdLS07Cgl9CglyZXR1cm4gYW5zOwp9CiAKaW50IGdldE4oKSB7CglpbnQgYyA9IDA7CglzdHJpbmcgcCA9IHN0cmluZygxMCwgJzAnKSArIHN0cmluZyhESUdJVFMsICcxJyk7Cgl3aGlsZSAobmV4dF9wZXJtdXRhdGlvbihwLmJlZ2luKCksIHAuZW5kKCkpKSBjKys7CglyZXR1cm4gYzsKfQogCnNpZ25lZCBtYWluKCkgewoJY2luLnRpZSgwKS0+c3luY193aXRoX3N0ZGlvKDApOwojaWYgTW9zYWFiCglmcmVvcGVuKCJpbnB1dC50eHQiLCAiciIsIHN0ZGluKTsKCWZyZW9wZW4oIm91dHB1dC50eHQiLCAidyIsIHN0ZG91dCk7CiNlbmRpZgogCgkvLyByZXR1cm4gY291dCA8PCBnZXROKCksIDA7CiAKCWZhY3RbMF0gPSAxOwoJZm9yIChpbnQgaSA9IDE7IGkgPCAxNTsgaSsrKSB7CgkJZmFjdFtpXSA9IGZhY3RbaSAtIDFdICogaSAlIE07CgkJb25lc1tpXSA9IChvbmVzW2kgLSAxXSAqIDEwICsgMSkgJSBNOwoJfQoJaW52WzE0XSA9IGZwKGZhY3RbMTRdLCBNIC0gMik7Cglmb3IgKGludCBpID0gMTQ7IGkgPiAwOyBpLS0pIHsKCQlpbnZbaSAtIDFdID0gaW52W2ldICogaSAlIE07Cgl9CiAKCXN0cmluZyBwID0gc3RyaW5nKDEwLCAnMCcpICsgc3RyaW5nKERJR0lUUywgJzEnKTsKCWZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CgkJaW50IHggPSBiaXRzZXQ8RElHSVRTICsgMTA+KHApLnRvX3Vsb25nKCk7CgkJbXAxW2ldID0geCwgbXAyW3hdID0gaTsKCQluZXh0X3Blcm11dGF0aW9uKHAuYmVnaW4oKSwgcC5lbmQoKSk7Cgl9CiAKCWludCB0OwoJY2luID4+IHQ7Cgl2ZWN0b3I8cGFpcjxsbCwgbGw+ID4gYSh0KTsKCW1hcDxsbCwgbGw+IGFuczsKCWZvciAoYXV0byAmW2wscl06IGEpIHsKCQljaW4gPj4gbCA+PiByOwoJCWFuc1tyXSwgYW5zW2wgLSAxXTsKCX0KIAoJZm9yIChhdXRvICZbaSxqXTogYW5zKSB7CgkJbiA9IHRvX3N0cmluZyhpKTsKCQlpZiAobi5zaXplKCkgPCBESUdJVFMpCgkJCW4gPSBzdHJpbmcoRElHSVRTIC0gbi5zaXplKCksICcwJykgKyBuOwoJCWlkKyssIGogPSBmKDAsIDAsIDApOwoJfQogCglmb3IgKGF1dG8gJltsLHJdOiBhKSB7CgkJY291dCA8PCAoYW5zW3JdIC0gYW5zW2wgLSAxXSArIE0pICUgTSA8PCBlbDsKCX0KfQo=