#include #if __has_include() #include #endif using namespace std; #define LL(...) ll __VA_ARGS__;lin(__VA_ARGS__) #define FO(n) for(ll IJK=n;IJK-->0;) #define fo(i,...) for(auto[i,i##stop,i##step]=for_range(0,__VA_ARGS__);ivoid pp(const auto&...a){[[maybe_unused]]const char*c="";((o<(a...);} #define entry defpp void main();void main2();}int main(){my::io();my::main();}namespace my{ #define use_ml998244353 using ml=atcoder::modint998244353; namespace my{ auto&operator<<(ostream&o,const atcoder::modint998244353&x){return o<<(int)x.val();} void io(){cin.tie(nullptr)->sync_with_stdio(0);cout<constexpr auto for_range(T s,T b){T a=0;if(s)swap(a,b);return array{a-s,b,1-s*2};} void lin(auto&...a){(cin>>...>>a);} constexpr ll size2(auto x){x|=1;ll r=0;while(x>0)x>>=1,++r;return r;} constexpr ll size10(auto x){x|=1;ll r=0;while(x>0)x/=10,++r;return r;} templateconstexpr ll maxsize10(){return size10(numeric_limits::max());} templateusing pack_back_t=tuple_element_t>; } namespace my{ template>struct multiset:std::multiset{ multiset()=default; }; template>struct set:multiset{ set()=default; set(const vector&a){fe(a,e)emplace(e);} templateauto emplace(A&&...a){ T x(std::forward(a)...); if(auto p=this->find(x);p!=this->end())return std::pair{p,0}; return std::pair{multiset::emplace(x),1}; } }; } namespace my{ templatestruct vec; templatestruct hvec_helper{using type=vec::type>;}; templatestruct hvec_helper<0,T>{using type=T;}; templateusing hvec=hvec_helper::type; templatestruct vec:vector{ using vector::vector; ll size()const{return vector::size();} }; templaterequires(sizeof...(A)>=2)vec(const A&...a)->vec>>; templateauto iota(ll l,ll r=0){if(l>r)swap(l,r);vecv(r-l);std::iota(v.begin(),v.end(),l);return v;} } namespace my{ templatestruct pow_linear:vec{pow_linear(T a,ll n):vec(n+1,1){fo(i,n)(*this)[i+1]=(*this)[i]*a;}}; templatestruct pow10_linear:pow_linear{ vecrepunit_table; pow10_linear(ll n):pow_linear(10,n),repunit_table(n+2){fo(i,n+1)repunit_table[i+1]=repunit_table[i]*10+1;} }; templateT pow10(ll n){static const auto v=pow10_linear(maxsize10()-1);assert(nstruct pow_doubling:vec{ pow_doubling(T a,ll n):vec(n+1,a){fo(i,n)(*this)[i+1]=(*this)[i]*(*this)[i];} }; templatestruct pow10_doubling:pow_doubling{ vecrepunit_table; pow10_doubling(ll n):pow_doubling(10,n),repunit_table(n+2,1){fo(i,n+1)repunit_table[i+1]=((*this)[i]+1)*repunit_table[i];} T repunit(ll k)const{ T res=0; fo(i,size2(k))if(k>>i&1)res=res*(*this)[i]+repunit_table[i]; return res; } }; templateconstexpr T at10(auto x,auto i){return x/pow10(i)%10;} } namespace my{ templateT digit_sum(T x,ll b){T r=x;while(x)r-=(x/=b)*(b-1);return r;} templateT digit_sum10(T x){return digit_sum(x,10);} templateT slice10(T x,ll l,ll r){return x%pow10(r)/pow10(l);} templateT range10(T x,ll l,ll r){return slice10(x,l,r)*pow10(l);} } namespace my{entry void main(){ auto next_mono=[&](ll x){ fo(i,size10(x)+1){ if(at10(x,i)<9){ ll y=range10(x,i+1,size10(x)); fo(j,i+1)y+=(at10(x,i)+1)*pow10(j); return y; } } assert(0); }; setmonos(iota(10)); for(ll x=11;x<1e15;x=next_mono(x))if(monos.contains(digit_sum10(x)))monos.emplace(x); use_ml998244353 pow10_doublingp10(60); LL(T); FO(T){ LL(N); ll k=*monos.lower_bound(N+1); ll q=(k-(N+1))/8,r=(k-(N+1))%8; pp(p10.repunit(N+1)+r*ml(10).pow(q)+p10.repunit(q)*8); } }}