#include <bits/stdc++.h>
using namespace std;
struct fast_ios {
  fast_ios() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(10);
  };
} fast_ios_;
template <typename A, typename B>
bool chkmin(A &a, const B &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}
template <typename A, typename B>
bool chkmax(A &a, const B &b) {
  if (b > a) {
    a = b;
    return true;
  }
  return false;
}
template <typename T>
istream &operator>>(istream &stream, vector<T> &vec) {
  for (auto &x : vec) stream >> x;
  return stream;
}
void scan() {}
template <class T, class... Args>
void scan(T &a, Args &...rest) {
  cin >> a;
  scan(rest...);
}
using ll = long long;
using vl = vector<ll>;
using vb = vector<bool>;
using vi = vector<int>;
using pii = pair<int, int>;
template <typename T>
using vv = vector<vector<T>>;
template <typename T>
ostream &operator<<(ostream &stream, const vector<T> &vec) {
  if (!vec.empty()) {
    stream << vec[0];
    for (size_t i = 1; i != vec.size(); ++i) stream << ' ' << vec[i];
  }
  return stream;
}
template <typename T>
void print(const vector<T> &t) {
  cout << t << '\n';
}
template <typename T>
void print(const vector<vector<T>> &t) {
  for (const auto &row : t) {
    print(row);
  }
}
template <typename T>
void print(const T &t) {
  cout << t << ' ';
}
template <typename T, typename... Args>
void print(const T &t, const Args &...rest) {
  print(t);
  print(rest...);
}
template <typename T>
void println(const T &t) {
  cout << t << '\n';
}
template <typename T, typename... Args>
void println(const T &t, const Args &...rest) {
  print(t);
  println(rest...);
}
struct Frac {
  ll p, q;
};
bool operator<(const Frac &a, const Frac &b) { return a.p * b.q < a.q * b.p; }
int main() {
  int k;
  scan(k);
  if (k <= 9) {
    for (int i = int(1); i <= int(k); ++i) {
      println(i);
    }
    return 0;
  }
  for (int i = int(1); i <= int(9); ++i) {
    println(i);
  }
  k -= 9;
  int n = 10;
  for (int i = 0; i < k; ++i) {
    ll m = n;
    vi digits;
    while (m > 0) {
      digits.push_back(m % 10);
      m /= 10;
    }
    if (accumulate(begin(digits), end(digits), 0) == 9 * (int)(digits).size()) {
      println(n);
      ++n;
      continue;
    }
    reverse(begin(digits), end(digits));
    auto toll = [](const vi &d) {
      ll res = 0;
      for (const auto &x : d) {
        res *= 10;
        res += x;
      }
      return res;
    };
    vector<pair<Frac, ll>> cand;
    for (int i = (int)(0); i < (int)((int)(digits).size()); ++i) {
      if (digits[i] == 9) continue;
      vi tmp = digits;
      for (int j = (int)(i); j < (int)((int)(digits).size()); ++j) {
        tmp[j] = 9;
      }
      ll val = toll(tmp);
      ll sum = accumulate(begin(tmp), end(tmp), 0);
      cand.push_back({{val, sum}, val});
    }
    sort(begin(cand), end(cand));
    auto p = cand.front().first;
    if (p < Frac{n, accumulate(begin(digits), end(digits), 0)}) {
      n = p.p;
      println(n);
      ++n;
    } else {
      println(n);
      ++i;
      if (i < k) {
        n = p.p;
        println(n);
        ++n;
      }
    }
  }
  return 0;
}
