#include using namespace std; #define rep(i, a, b) for (int i = (int)(a); i < (int)(b); i++) #define rrep(i, a, b) for (int i = (int)(b) - 1; i >= (int)(a); i--) using ll = long long; template struct ModInt { using mint = ModInt; static constexpr unsigned long long get_mod() { return m; } ModInt() : _v(0) {} ModInt(int64_t v) : _v((v % umod() + umod()) % umod()) {} unsigned long long val() const { return _v; } mint &operator+=(const mint &rhs) { if ((_v += rhs._v) >= umod()) _v -= umod(); return *this; } mint &operator-=(const mint &rhs) { if ((_v -= rhs._v) >= umod()) _v += umod(); return *this; } mint &operator*=(const mint &rhs) { _v = (unsigned long long)((__uint128_t)_v * rhs._v % umod()); return *this; } friend mint operator+(const mint &lhs, const mint &rhs) { return mint(lhs) += rhs; } friend mint operator-(const mint &lhs, const mint &rhs) { return mint(lhs) -= rhs; } friend mint operator*(const mint &lhs, const mint &rhs) { return mint(lhs) *= rhs; } private: unsigned long long _v; static constexpr unsigned long long umod() { return m; } }; using mint = ModInt<>; const mint inv2 = mint((mint::get_mod() + 1) / 2); constexpr int K = 19; ll pow10[K]; mint mpow10[K]; // [1,N) mint f(ll N) { mint ret = 0; for (int k = 0;; k++) { if (k + 1 < K && pow10[k + 1] <= N){ ret += mpow10[k] * mpow10[k] * 45; continue; } mint x = 0; rrep(l, 0, k + 1) { int c = l == k; int d = N / pow10[l] % 10; ret += x * mint(d - c) * mpow10[l]; ret += ((d - c) * (c + d - 1) / 2) * mpow10[k - l] * mpow10[l]; ret += (mpow10[l] * (mpow10[l] - 1) * inv2) * 10 * mpow10[k - l] * mint(d - c); x += d * mpow10[k - l]; } break; } return ret; } int main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); pow10[0] = 1; rep(i, 1, K) pow10[i] = pow10[i - 1] * 10; mpow10[0] = 1; rep(i, 1, K) mpow10[i] = pow10[i]; int T; cin >> T; while (T--) { ll L, R; cin >> L >> R; mint ans = f(R + 1) - f(L); cout << ans.val() << "\n"; } }