#define _USE_MATH_DEFINES
#include<cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <deque>
#include <algorithm>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
#include <iterator>
#include<iomanip>

using namespace std;

#define rep(i,a,b) for(int i=(a), i##_len=(b);i<i##_len;i++)
#define rrep(i,a,b) for(int i=(b)-1;i>=(a);i--)
#define all(c) begin(c),end(c)

#define int ll
#define SZ(x) ((int)(x).size())
#define pb push_back
#define mp make_pair

typedef long long ll;
//typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<double, double> pdd;
typedef vector<vector<int>> mat;
//typedef unsigned int uint;

template<class T> bool chmax(T &a, const T &b) { if (a < b) { a = b; return true; } return false; }
template<class T> bool chmin(T &a, const T &b) { if (b < a) { a = b; return true; } return false; }

const int INF = sizeof(int) == sizeof(long long) ? 0x3f3f3f3f3f3f3f3fLL : 0x3f3f3f3f;
const int MOD = (int)1e9 + 7;
const double EPS = 1e-9;

int pow10[18];

int sunuke(int N)
{
	int res = N;
	int digiNum[18] = { 0 };
	int digiN = 0;
	int Sn = 0;
	int t = N;
	do
	{
		digiN++;
		digiNum[digiN] = t % 10;
		Sn += digiNum[digiN];
		t /= 10;
	} while (t > 0);

	double resn = (double)N / Sn;

	rep(i, 1, digiN + 1)
	{
		N += (9 - digiNum[i])*pow10[i];
		Sn += (9 - digiNum[i]);
		if (chmin(resn, (double)N / Sn))
		{
			res = N;
		}
	}

	return res;
}

signed main()
{
	cin.tie(0);
	ios::sync_with_stdio(false);

	pow10[1] = 1;
	rep(i, 2, 17)
	{
		pow10[i] = pow10[i - 1] * 10;
	}

	int K;
	int c = 0;
	int N = 1;
	cin >> K;
	while (c < K)
	{
		cout << N << endl;
		N = sunuke(N + 1);
		c++;
	}

	return 0;
}