#include <bits/stdc++.h>
using namespace std;

using VI = vector<int>;
using VVI = vector<VI>;
using PII = pair<int, int>;
using LL = long long;
using VL = vector<LL>;
using VVL = vector<VL>;
using PLL = pair<LL, LL>;
using VS = vector<string>;

#define ALL(a)  begin((a)),end((a))
#define RALL(a) (a).rbegin(), (a).rend()
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define MT make_tuple
#define SZ(a) int((a).size())
#define SORT(c) sort(ALL((c)))
#define RSORT(c) sort(RALL((c)))
#define UNIQ(c) (c).erase(unique(ALL((c))), end((c)))

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)

#define FF first
#define SS second

#define DUMP(x) cout<<#x<<":"<<(x)<<endl
template<class S, class T>
istream& operator>>(istream& is, pair<S,T>& p){
  return is >> p.FF >> p.SS;
}
template<class T>
istream& operator>>(istream& is, vector<T>& xs){
  for(auto& x: xs)
	is >> x;
  return is;
}
template<class S, class T>
ostream& operator<<(ostream& os, const pair<S,T>& p){
  return os << p.FF << " " << p.SS;
}
template<class T>
ostream& operator<<(ostream& os, const vector<T>& xs){
  for(unsigned int i=0;i<xs.size();++i)
	os << (i?" ":"") << xs[i];
  return os;
}
template<class T>
void maxi(T& x, T y){
  if(x < y) x = y;
}
template<class T>
void mini(T& x, T y){
  if(x > y) x = y;
}


const double EPS = 1e-10;
const double PI  = acos(-1.0);
const LL MOD = 1e9+7;

LL S(LL x){
  LL res = 0;
  while(x){
	res += x % 10;
	x /= 10;
  }
  return res;
}

int main(){
  cin.tie(0);
  ios_base::sync_with_stdio(false);

  /*
  for(LL n=1000;n<10000;++n){
	LL sn = S(n);
	bool ok = true;
	for(LL m=n+1;m<1e9;++m){
	  if(n * S(m) > m * sn){
		ok = false;
		break;
	  }
	}
	if(ok) cout << n << endl;
  }
  */

  /*
  LL p = 1, q = 1;
  vector<PLL> xs;
  xs.EB(q, p);
  FOR(n,2,1000000){
	LL sn = S(n);
	xs.EB(n, sn);
  }

  auto comp = [](const PLL& l, const PLL& r){
	if(l.FF * r.SS != l.SS * r.FF)
	  return (l.FF * r.SS < l.SS * r.FF);
	return l.FF < r.FF;
  };
  sort(ALL(xs), comp);

  LL mx = 0;
  for(auto& p: xs){
	if(mx < p.FF){
	  mx = p.FF;
	  cout << mx << endl;
	}
  }
  
  return 0;
  */

  
  LL K;
  cin >> K;

  vector<PLL> ans;
  FOR(i,1,10) ans.EB(i,i);
  FOR(i,1,10) ans.EB(i * 10 + 9, S(i * 10 + 9));
  FOR(i,1,10) ans.EB(i * 100 + 99, S(i * 10 + 9));

  for(LL pfx=1;pfx<1000;++pfx){
	for(LL sfx=9,p=10;;sfx=sfx*10+9,p*=10){
	  LL x = pfx * p + sfx;
	  if(x > 1e15) break;
	  ans.EB(x, S(x));
	}
  }
  cerr<<SZ(ans)<<endl;
  auto comp = [](const PLL& l, const PLL& r){
	if(l.FF * r.SS != l.SS * r.FF)
	  return (l.FF * r.SS < l.SS * r.FF);
	return l.FF < r.FF;
  };
  sort(ALL(ans), comp);
  UNIQ(ans);

  LL mx = 0;
  VL tmp;
  for(auto& p: ans){
	if(mx < p.FF){
	  mx = p.FF;
	  tmp.PB(mx);
	}
  }

  assert(SZ(tmp) >= K);
  REP(i,K) cout << tmp[i] << endl;

  return 0;
  
  /*
  FOR(i,1,10) ans.PB(i);
  FOR(i,1,10) ans.PB(i * 10 + 9);
  FOR(i,1,10) ans.PB(i * 100 + 99);

  int d = 1, dig = 3;
  while(SZ(ans) < K){
	LL p = pow(10, dig);
	for(int dd=1;dd<=d;++dd){
	  REP(x,10)
		ans.PB(dd * p + x * (p/10) + (p/10)-1);
	}
	for(int dd=d+1;dd<10;++dd){
	  ans.PB(dd * p + p - 1);
	}

	++dig;
	++d;
	if(d >= 10) d = 9;
  }
  */

  REP(i,K) cout << ans[i].FF << endl;
  
  return 0;
}


Measured memory_bytes: 640