#include<iostream>
#include<iomanip>

#include<vector>
#include<queue>
#include<set>
#include<map>
#include<string>

#include<algorithm>
#include<cmath>
#include<utility>

using namespace std;
typedef long long ll;
template <class T> inline bool chmax(T& a, T b) {if (a < b) {a = b; return 1;} return 0;}
template <class T> inline bool chmin(T& a, T b) {if (a > b) {a = b; return 1;} return 0;}
const long long INF = 1LL << 60;
//以下変更可能領域



/* 
int main() {
    int N;
    cin >> N;
    vector<int> p(N);
    for (int i = 0; i < N; i++) cin >> p[i];
    
    int cnt = 0;

    for (int i = 1;i < N-1; i++) {
        if ((p[i-1] < p[i] && p[i] < p[i+1]) || (p[i-1] > p[i] && p[i] > p[i+1]))
        cnt++;
    }
    cout << cnt << "\n";
}*/
/* 
int main() {
    int N;
    cin >> N;
    vector<int> d(N);
    for (int i = 0; i < N; i++) cin >> d[i];
    sort(d.begin(),d.end());
    cout << d[N/2] - 
    d[N/2-1] << "\n";
}*/

/* 
struct edge {int to, cost;};

vector<edge> G[100000];

int d[100000];
int d2[100000];
int V,E;
typedef pair<int,int> P;

//s番目の頂点から各頂点への最短距離を求める
void solve(int s){
    priority_queue<P, vector<P>,greater<P> > que;
    
    for (int i = 0; i < V; i++){
        d[i] = 1000000;
        d2[i] = 1000000;
    }
    d[s] = 0;
    que.push(P(s,0));
    while (!que.empty()) {
        P p = que.top(); que.pop();
        int v = p.second, c = p.first;
        if (d2[v] < c) continue;
        for (int i = 0; i < G[v].size(); i++) {
            edge &e = G[v][i];
            int c2 = c + e.cost;
            if (d[e.to] > c2) {
                swap(d[e.to], c2);
                que.push(P(d[e.to], e.to));
            } if (d2[e.to] > c2 && d[e.to] < c2) {
                d2[e.to] = c2;
                que.push(P(d2[e.to], e.to));
            }
        }
    } 
}

int main() {
    cin >> V >> E;
    for (int i = 0; i < E; i++) {
        int u,v;
        edge e;
        cin >> u >> v;
        e.cost = 1;
        e.to = v - 1;
        G[u - 1].push_back(e);
    }
    int s,t;
    cin >> s >> t;
    solve(s-1);
    if (d[t-1] == 1000000) {
        cout << -1 << "\n";
    } else {
        if (d[t-1] % 3 == 0) {
            cout << d[t-1] / 3 << "\n";
        } else if (d[t-1] % 3 == 1) {
            cout << d[t-1] / 3 + 1 << "\n";
        } else {
            int res = d[t-1] / 3 + 2;
            if (d2[t-1] != 1000000) {
                if (d2[t-1] % 3 == 0) {
                    chmin(res,d2[t-1]/3);
                } else if (d2[t-1] % 3 == 1) {
                    chmin(res,d2[t-1]/3+1);
                }
            }
            cout << res << "\n";
        }
    }
}*/

ll R = 1000000000 + 7;

std::vector<std::vector<long long>> comb(int n, int r) {
  std::vector<std::vector<long long>> v(n + 1,std::vector<long long>(n + 1, 0));
  for (int i = 0; i < v.size(); i++) {
    v[i][0] = 1;
    v[i][i] = 1;
  }
  for (int j = 1; j < v.size(); j++) {
    for (int k = 1; k < j; k++) {
      v[j][k] = (v[j - 1][k - 1] + v[j - 1][k]) % R;
    }
  }
  return v;
}


int main() {
    int N, K;
    cin >> N >> K;
    vector<vector<ll> > combination = comb(N,K);
    for (int i = 1; i <= K; i++) {
        ll tmp = combination[K-1][i-1] % R;
        tmp = ((tmp % R) * (combination[N+1-K][i] % R)) % R;
        cout << tmp << "\n";
    }
}


Measured memory_bytes: 31616