#include #include using namespace std; using namespace atcoder; using ll = long long; // using mint = modint998244353; // using mint = modint1000000007; template using vec = vector; template using pa = pair; template using mipq = priority_queue, greater>; #define REP(_1, _2, _3, _4, name, ...) name #define REP1(i, n) for (auto i = decay_t{}; (i) < (n); ++(i)) #define REP2(i, l, r) for (auto i = (l); (i) < (r); ++(i)) #define REP3(i, l, r, d) for (auto i = (l); (i) < (r); i += (d)) #define rep(...) REP(__VA_ARGS__, REP3, REP2, REP1)(__VA_ARGS__) #define rrep(i, r, l) for (int i = (r); i >= (l); --i) template bool chmax(T &a, const T &b) { return (a < b ? a = b, true : false); } template bool chmin(T &a, const T &b) { return (a > b ? a = b, true : false); } constexpr int INF = 1 << 30; constexpr ll LINF = 1LL << 60; constexpr int mov[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; void solve(); int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(15); int T = 1; // cin >> T; while (T--) solve(); } constexpr ll MOD = 7e9 + 1; ll pow10[20]; unordered_map memo; ll rev(ll n) { string s = to_string(n); ranges::reverse(s); return stoll(s); } ll calc(ll n) { assert(n >= 0); if (memo.contains(n)) return memo[n]; ll res = 0; if (n < 100) { rep(i, 1, n + 1) { res += rev(i); } } else { string s = to_string(n); int L = s.size(); res = 45; rep(i, 2, L) { res += 45 * pow10[i - 1] % MOD * (pow10[i - 1] - pow10[i - 2]) % MOD; res %= MOD; } ll x = n / 10, y = pow10[L - 2] - 1; res += 10 * calc(x - 1); res %= MOD; res += 45 * pow10[L - 1] % MOD * (x - 1 - y) % MOD; res %= MOD; ll v = n % 10; res += (v + 1) * rev(x); res += v * (v + 1) / 2 * pow10[L - 1]; res %= MOD; } memo[n] = res; return res; } void solve() { pow10[0] = 1; rep(i, 1, 20) { pow10[i] = pow10[i - 1] * 10 % MOD; } int N; cin >> N; rep(i, N) { ll l, r; cin >> l >> r; ll res = (calc(r) - calc(l - 1) + MOD) % MOD; cout << res << '\n'; } }