#include #include using namespace std; using i64 = long long; template class Range{private:struct I{T x;T operator*(){return x;}bool operator!=(I& lhs){return x; bool is_kado(int a, int b, int c) { return (a!=b&&b!=c&&c!=a) && ((a>b&&bc)); } i64 g(i64 x) { string s = to_string(x); int n = s.size(); vector>>>> dp(n+1, vector>>>(2, vector>>(2, vector>(11, vector(11, 0))))); // dp[n+1][2][2][11][11] // [][][題意を満たすか][一個前の桁][二個前の桁] dp[0][0][1][10][10] = 1; for(auto&& i : range(n)) { for(auto&& j : range(2)) { for(auto&& ok : range(2)) { for(auto&& b1 : range(11)) { for(auto&& b2 : range(11)) { if(!dp[i][j][ok][b1][b2]) { continue; } for(auto&& d : range(j?10:s[i]-'0'+1)) { int flag = j || d < s[i] - '0', nb1 = (b1==10 && d==0) /* not nuke0 yet */ ? 10 : d, nb2 = b1, nok = ok && (is_kado(b2, b1, d) || b2 == 10); if(!nok) { continue; } dp[i+1][flag][nok][nb1][nb2] += dp[i][j][ok][b1][b2]; } } } } } } i64 res = 0; for(auto&& j : range(2)) { for(auto&& b1 : range(11)) { for(auto&& b2 : range(11)) { res += dp[n][j][1][b1][b2]; } } } return res; } i64 f(i64 k) { k += g(101); i64 lo = 0, hi = i64(pow(2, 60)); while(hi - lo > 10) { i64 md = (lo + hi) / 2; (g(md) < k ? lo : hi) = md; } for(auto&& x : range(lo, hi+1)) { if(g(x) == k) { return x; } } throw; } int main(void) { int t; scanf("%d", &t); for(auto&& loop : range(t)) { i64 k; scanf("%lld", &k); i64 res = f(k); printf("%lld\n", res); } return 0; }