// Slower C++ solution:
#include <bits/stdc++.h>

#define int long long

#define mod (int)(1e9+7)

#define inf (int)(3e18+7)

#define rep(i,n) for(int i=0;i<n;i++)

#define REP(i,n) for(int i=1;i<n;i++)

#define P pair<int,int>

#define PiP pair<int,pair<int,int>>

#define all(v) v.begin(),v.end()

#define mkp make_pair

#define mkt make_tuple

#define prique(T) priority_queue<T,vector<T>,greater<T>>

#define vecunique(vec) sort(vec.begin(), vec.end());decltype(vec)::iterator result = std::unique(vec.begin(), vec.end());vec.erase(result, vec.end())

using namespace std;



bool prime(int x) {

	for (int i = 2; i * i <= x; i++) {

		if (x % i == 0)return false;

	}

	return x > 1;

}

int gcd(int x, int y) {

	if (y == 0)return x;

	return gcd(y, x % y);

}

int lcm(int x, int y) {

	return x / gcd(x, y) * y;

}

int kai(int x, int y) {

	int res = 1;

	for (int i = x - y + 1; i <= x; i++) {

		res *= i; res %= mod;

	}

	return res;

}

int mod_pow(int x, int y) {

	int res = 1;

	while (y > 0) {

		if (y & 1) {

			res = res * x % mod;

		}

		x = x * x % mod;

		y >>= 1;

	}

	return res;

}

int comb(int x, int y) {

	if (y > x)return 0;

	return kai(x, y) * mod_pow(kai(y, y), mod - 2) % mod;

}

/*--------Library Zone!--------*/



int n, k;

int dp[2005][2005];

signed main() {

	cin >> n >> k;

	dp[1][1] = 1;

	REP(i, n + 1) {

		REP(j, n + 1) {

			dp[i + 1][j + 1] += dp[i][j];

			dp[i + 1][j] += dp[i][j];

			dp[i + 1][j + 1] %= mod;

			dp[i + 1][j] %= mod;

		}

	}

	REP(i, k + 1) {

		if (n - k + 1 < i) {

			cout << 0 << endl; continue;

		}

		int memo = n - k;

		memo -= i - 1;

		cout << dp[k][i] * comb(memo + i, memo) % mod << endl;

	}

}

// Faster C++ solution for the same problem (measured speedup: 1.7073231250916503x):
#include <bits/stdc++.h>

#define int long long

#define mod (int)(1e9+7)

#define inf (int)(3e18)

#define rep(i,n) for(int i=0;i<n;i++)

#define REP(i,n) for(int i=1;i<n;i++)

#define P pair<int,int>

#define PiP pair<int,pair<int,int>>

#define PP pair<P,P>

#define all(v) v.begin(),v.end()

#define mkp make_pair

#define mkt make_tuple

#define prique(T) priority_queue<T,vector<T>,greater<T>>

#define vecunique(vec) sort(vec.begin(), vec.end());decltype(vec)::iterator result = std::unique(vec.begin(), vec.end());vec.erase(result, vec.end())

using namespace std;

template<class T> inline void chmax(T& a, T b) { a = max(a, b); }

template<class T> inline void chmin(T& a, T b) { a = min(a, b); }



bool prime(int x) {

	for (int i = 2; i * i <= x; i++) {

		if (x % i == 0)return false;

	}

	return x > 1;

}

int gcd(int x, int y) {

	if (y == 0)return x;

	return gcd(y, x % y);

}

int lcm(int x, int y) {

	return x / gcd(x, y) * y;

}

int kai(int x, int y) {

	int res = 1;

	for (int i = x - y + 1; i <= x; i++) {

		res *= i; res %= mod;

	}

	return res;

}

int mod_pow(int x, int y, int m) {

	int res = 1;

	while (y > 0) {

		if (y & 1) {

			res = res * x % m;

		}

		x = x * x % m;

		y >>= 1;

	}

	return res;

}

int comb(int x, int y) {

	if (y > x)return 0;

	return kai(x, y) * mod_pow(kai(y, y), mod - 2, mod) % mod;

}

int get_rand(int MIN, int MAX) {

	random_device rnd;

	mt19937_64 mt64(rnd());

	uniform_int_distribution<int>engine(MIN, MAX);

	return engine(mt64);

}

/*--------Library Zone!--------*/





signed main() {

	int n, k; cin >> n >> k;

	for (int i = 1; i <= k; i++) {

		if (n - k < i - 1) {

			cout << 0 << endl; continue;

		}

		int p = comb(k - 1, i - 1);

		int ko = n - k - (i - 1);

		int q = comb(i + ko, i);

		cout << p * q % mod << endl;

	}

}