#nullable enable #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Trim().Split(' '), 0); return T.Parse(_input[_iter++], null); } #endregion long F(long x) { var dz = new List(); while (x > 0) { var (p, q) = long.DivRem(x, 10); dz.Add((int)q); x = p; } dz.Reverse(); var dp1 = new (long, long)[10]; var dp2 = new (long, long)[10]; dp1[0] = (0, 1); foreach (var d in dz) { var ep1 = new (long, long)[10]; var ep2 = new (long, long)[10]; for (var i = 0; i < 10; i++) { var (v, c) = dp1[i]; for (var j = 0; j < d; j++) { var m = Math.Max(i, j); var (ve, ce) = ep2[m]; ep2[m] = (ve + c * m, ce + c); } { var m = Math.Max(i, d); var (ve, ce) = ep1[m]; ep1[m] = (ve + c * m, ce + c); } } for (var i = 0; i < 10; i++) { var (v, c) = dp2[i]; for (var j = 0; j < 10; j++) { var m = Math.Max(i, j); var (ve, ce) = ep2[m]; ep2[m] = (ve + c * m, ce + c); } } (dp1, dp2) = (ep1, ep2); } var res = 0L; for (var i = 0; i < 10; i++) res += dp1[i].Item1 + dp2[i].Item1; return res; } var ans = new List(); var t = I(); for (var j = 0; j < t; j++) { var l = I(); var r = I(); ans.Add(F(r) - F(l - 1)); } Console.WriteLine(string.Join(Environment.NewLine, ans));