#pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include using namespace std; using ll = long long; using vl = vector; using vvl = vector; using vvvl = vector; #define rep(i, n) for (int i = 0; i < n; i++) ll f(ll x) { string s = to_string(x); vvvl dp(s.size() + 1, vvl(10, vl(2, 0))); dp[0][0][1] = 1; rep(i, s.size()) { rep(j, 10) { // k==0(好きにしていい) rep(k, 10) dp[i + 1][max(j, k)][0] += dp[i][j][0]; // k==1(ギリギリ注意報) rep(k, s[i] - '0') dp[i + 1][max(j, k)][0] += dp[i][j][1]; dp[i + 1][max(j, s[i] - '0')][1] += dp[i][j][1]; } } ll sm = 0; rep(j, 10) { rep(k, 2) { sm += dp.back()[j][k] * j; } } return sm; } ll g(ll x) { string s = to_string(x); int mn = 0; for (auto c : s) mn = max(mn, c - '0'); return mn; } int main() { int t; cin >> t; rep(_, t) { ll x; cin >> x; ll l = 1; ll r = 1e18; while (r - l > 1) { ll mid = (l + r) / 2; if (f(mid) >= x) { r = mid; } else { l = mid; } } r = l; l = 1; ll rest = x - f(r); while (rest != 0) { rest -= g(r + 1); r++; while (rest < 0) { rest += g(l); l++; } } cout << l << " " << r << endl; } }