#nullable enable #region var (_input, _iter) = (Array.Empty(), 0); string String() { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Split(' '), 0); return _input[_iter++]; } T I() where T : IParsable => T.Parse(String(), null); #endregion var dp = new Dictionary<(int, int), int>(); var numbers = new[]{ 0, 1, 8 }; int F(int left, int k, int j, int last) { if (j == k * 8) return left == 0 ? 10 : -1; var key = (left, k * 10000 + j * 100 + last); if (dp.TryGetValue(key, out var cv)) return cv; var res = -1; foreach (var d in numbers) { if (d > last || d > left) continue; var nl = left - d; var nextLevel = (j + 1) % k == 0; if (j + 1 < k * 8 && nextLevel) { if (nl % 10 != 0) continue; nl /= 10; } if (F(nl, k, j + 1, nextLevel ? 8 : d) >= 0) { res = d; break; } } return dp[key] = res; } var t = I(); var ans = new List(); for (var _lp = 0; _lp < t; _lp++) { var n = I(); for (var i = 1; i <= 8; i++) { var l = 81181819 - n; if (F(l, i, 0, 8) >= 0) { ans.Add(i); var sns = new string[i]; for (var j = 0; j < i; j++) sns[j] = ""; var h = 0; var last = 8; for (var p = 0; p < 8; p++) { for (var q = 0; q < i; q++) { var d = F(l, i, h++, last); sns[q] = d.ToString() + sns[q]; l -= d; last = d; } l /= 10; last = 8; } foreach (var s in sns) { var sn = int.Parse(s); ans.Add(sn); } break; } } } Console.WriteLine(string.Join(Environment.NewLine, ans));