# Test: Gemini import sys def main(): # 入力を一括で読み込み高速化 input_data = sys.stdin.read().split() if not input_data: return T = int(input_data[0]) MOD = 7000000001 # --- 前計算 --- # P[i] = 10^0 + 10^1 + ... + 10^{i-1} を前計算 P = [0] * 20 for i in range(1, 20): P[i] = P[i-1] + 10**(i-1) # S_FULL[L] : 桁数 L の正整数すべての rev(i) の総和 S_FULL = [0] * 20 S_FULL[1] = 45 for L in range(2, 20): sum_10 = P[L] - P[1] S_FULL[L] = 45 * (10 ** (L - 1)) + 405 * (10 ** (L - 2)) * sum_10 # 1 から x までの rev(i) の総和を求める関数 def calc(x): if x <= 0: return 0 s = str(x) K = len(s) # 1. 桁数が K 未満のものの総和 ans = sum(S_FULL[1:K]) prefix_sum = 0 # 2. 桁数が K で、i 桁目で初めて x の値より小さくなるものの総和 for i in range(K): xi = int(s[i]) # 選べる数字 d の範囲 start_d = 1 if i == 0 else 0 end_d = xi - 1 # 下位桁の自由度 C = 10 ** (K - 1 - i) # 下位桁の寄与の合計 suffix_sum = 0 if K - 1 - i > 0: sum_j = P[K] - P[i+1] suffix_sum = 45 * (10 ** (K - 2 - i)) * sum_j if end_d >= start_d: count = end_d - start_d + 1 sum_d = (start_d + end_d) * count // 2 # 決定済みの上位桁の寄与 ans += prefix_sum * C * count # i 桁目自身の寄与 ans += sum_d * (10 ** i) * C # 自由な下位桁の寄与 ans += suffix_sum * count # 次の桁の計算に向けて、上位桁の寄与状態を更新 prefix_sum += xi * (10 ** i) # 3. x 自身の寄与 ans += int(s[::-1]) return ans # --- 各テストケースの処理 --- out = [] idx = 1 for _ in range(T): if idx >= len(input_data): break L = int(input_data[idx]) R = int(input_data[idx+1]) idx += 2 # 累積和の要領で区間の和を求める res = (calc(R) - calc(L - 1)) % MOD out.append(str(res)) sys.stdout.write('\n'.join(out) + '\n') if __name__ == '__main__': main()