#include <iostream>
#include <vector>
#include <set>
#include <regex>
#include <math.h>
#include "ConsoleApplication1.h"

using namespace std;

#define FOR(i, a, b) for (auto i = (a); i < (b); ++i)
#define REP(i, n) FOR(i, 0, n)
#define DEBUG(_debuged) cerr << #_debuged << ":" << _debuged << endl;

struct L
{
	int t;
	int x;
	int y;
};

vector<int> loadn(int n)
{
	vector<int> v(n);
	REP(i, n)
		cin >> v[i];
	return v;
}

uint64_t modpower(const unsigned int N, const unsigned int K, const unsigned int MOD)
{
	uint64_t ret = 1;
	uint64_t k2 = N;
	REP(i, 31)
	{
		if ((K >> i) & 0x1)
		{
			ret *= k2;
			ret = ret % MOD;
		}
		k2 = (k2 * k2) % MOD;
	}
	return ret;
}

class ModCombinationMemo
{
public:
	const unsigned int N;
	const unsigned int MOD;
	vector<uint64_t> memo = { 1 };

	ModCombinationMemo(uint32_t N, uint32_t MOD)
		: N(N), MOD(MOD)
	{
	}

	uint64_t c(uint64_t k)
	{
		if (memo.size() > k)
		{
			return memo[k];
		}

		FOR(i, memo.size(), k + 1)
		{
			const auto number = (memo[i - 1] * (N - i + 1)) % MOD;
			const auto reverceDeon = modpower(i, MOD - 2, MOD);
			memo.push_back(number * reverceDeon % MOD);
		}

		return memo[k];
	}
};

uint64_t c(const unsigned int N, const unsigned int K, const unsigned int MOD)
{
	if (K == 0)
	{
		return 1;
	}

	uint64_t n = 1, k = 1;

	REP(i, K)
	{
		n *= N - i;
		k *= i + 1;

		n = n % MOD;
		k = k % MOD;
	}

	uint64_t powerk = modpower(k, MOD - 2, MOD);

	return (n * powerk) % MOD;
}

unsigned trailing_zeros(unsigned n)
{
	if (!n)
		return -1;
	unsigned int c = 32; // c will be the number of zero bits on the right
	n &= -(signed)n;
	if (n)
		c--;
	if (n & 0x0000FFFF)
		c -= 16;
	if (n & 0x00FF00FF)
		c -= 8;
	if (n & 0x0F0F0F0F)
		c -= 4;
	if (n & 0x33333333)
		c -= 2;
	if (n & 0x55555555)
		c -= 1;
	return c;
}

unsigned int digitssum(uint64_t source) {
	unsigned int result = 0;

	while (source > 0) {
		result += source % 10;
		source /= 10;
	}

	return result;
}

unsigned int digitssum(string source) {
	unsigned int result = 0;

	REP (i, source.length()){
		result += source[i] - '0';
	}

	return result;
}

struct oishisa
{
	int64_t x;
	int64_t y;
	int64_t z;
};

int64_t cint()
{
	int64_t i;
	cin >> i;
	return i;
}

int main(int argc, char *argv[], char *envp[])
{
	const int64_t K(cint());


	vector<uint64_t> v;
	v.push_back(0);
	FOR(sum, 1, 150) {
		string st;

		if (sum % 9) {
			st.push_back(('0' + sum % 9));
		}
		REP(digits, sum / 9) {
			st.push_back('9');
		}

		double max = stod(st) / digitssum(st);

		v.push_back(max);
	}

	uint64_t out = 0;
	uint64_t i = 0;
	while (out < K) {
			i++;
		
		if (i > 10000) {
			uint64_t k =  pow(10, uint64_t(log10(i) - 3)) - 1;
			i += (k - i % (k + 1));
		}

		const auto value = double(i) / digitssum(i);

		const auto nextMin = v[digitssum(i) + 1];

		if (value <= nextMin) {
			cout << i << endl;
			out++;
		}
	}
}
