# include <iostream>
# include <algorithm>
# include <vector>
# include <string>
# include <set>
# include <map>
# include <cmath>
# include <iomanip>
# include <functional>
# include <utility>
# include <stack>
# include <queue>
# include <list>
# include <bitset>
# include <complex>
#include<limits.h>
#include<unordered_map>
#include<unordered_set>
#include<deque>
#include<cstdio>
using namespace std;
typedef long long int ll;
const int N = 1000000;
const int mod = 1000000007;
const int INF = 1 << 30;
int dx[4] = { 0,1,0,-1 }, dy[4] = { 1,0,-1,0 };
#define rep(i,n) for(ll i=(ll)0;i<(ll)n;++i)
#define vin(v,n) rep(i,n)cin>>v[i];
#define ALL(x) x.begin(),x.end()
#define pp pair<ll,ll>
#define sz size()
#define fi first
#define se second
#define pb push_back
#define prqueue priority_queue<ll,vector<ll>,greater<ll>>
string YN(bool b) { return(b ? "YES" : "NO"); }
string yn(bool b) { return(b ? "Yes" : "No"); }
ll k;
vector<ll>v;
int main() {
	cin >> k;
	rep(i, 9)v.pb(i + 1);
	rep(i, 9)v.pb((i + 1) * 10 + 9);
	rep(i, 9)v.pb((i + 1) * 100 + 9);
	ll n = 99,m=999;
	rep(j, 9) {
		for (int i = 10; i <= 18 + j * 10; ++i)v.pb(pow(10, 2 + j)*i + n);
		for (int i = j + 1; i <= 9; ++i)v.pb(pow(10, 3 + j)*i + m);
		if(j!=8)n += pow(10, 2 + j) * 9; m += pow(10, 3 + j) * 9;
	}
	rep(j, 3) {
		for (int i = 10; i <= 99; ++i)v.pb(pow(10, j + 11)*i + m);
		for (int i = 100; i <= 108 + 10 * j; ++)v.pb(pow(10, j + 10)*i + n);
		n += pow(10, 11 + j) * 9; m += pow(10, 10 + j) * 9;
	}
	rep(i, k)cout << v[i] << endl;
	return 0;
}