#include <bits/stdc++.h>
using namespace std;
template <typename T = long long>
inline T IN() {
  T x;
  cin >> x;
  return (x);
}
inline void CIN() {}
template <class Head, class... Tail>
inline void CIN(Head &&head, Tail &&...tail) {
  cin >> head;
  CIN(move(tail)...);
}
template <typename T = string>
inline void eputs(T s) {
  cout << s << "\n";
  exit(0);
}
template <typename A, size_t N, typename T>
void Fill(A (&array)[N], const T &val) {
  std::fill((T *)array, (T *)(array + N), val);
}
template <typename T>
using PQG = priority_queue<T, vector<T>, greater<T>>;
template <typename T>
using PQ = priority_queue<T>;
const long long INF = 1e9;
const long long MOD = 1e9 + 7;
const long long LINF = 1e18 + 1;
const long long dx[] = {1, -1, 0, 0};
const long long dy[] = {0, 0, 1, -1};
long long K;
long long mypow(long long x, long long n) {
  long long res = 1;
  while (n > 0) {
    if (n & 1) res = res * x;
    x *= x;
    n >>= 1;
  }
  return res;
}
long long digsum(long long x) {
  long long ret = 0;
  while (x > 0) {
    ret += x % 10;
    x /= 10;
  }
  return ret;
}
long long increment(long long x) {
  PQG<pair<double, long long>> pqg;
  long long dig = to_string(x).length();
  for (long long d = 0; d < (dig + 1); ++d)
    for (long long i = 0; i < (10); ++i) {
      string s;
      if (dig - d - 1 >= 0) s += to_string(x).substr(0, dig - d - 1);
      s += to_string(i);
      s += string(d, '9');
      long long v = stoll(s);
      if (v > x) pqg.emplace(v * 1.0 / digsum(v), v);
    }
  return pqg.top().second;
}
signed main() {
  cin >> K;
  long long now = 1;
  for (long long loop = 0; loop < (K - 1); ++loop) {
    cout << now << "\n";
    now = increment(now);
  }
}
