N, K = list(map(int, input().split()))



def nCr(n,r):

  if n < 0 or r < 0 or n < r: return 0

  if n - r < r: r = n - r

  if r == 0: return 1

  if r == 1: return n

  

  # 分子のn*(n-1)*...がr個分続くやつ

  numerator = [n-r+k+1 for k in range(r)]

  # 分母：r!=r*(r-1)*...*3*2の要素

  denominator = [k+1 for k in range(r)]

  

  # 分母の要素で割れる部分を割っていく部分

  for p in range(2, r+1):

    # 分母は1,2,3,...rのようになっており、1は意味がないのでスキップした形か

    pivot = denominator[p-1]

    if pivot > 1:

      # 分子のX番目と分母のX-offset番目が共通の約数を持つということだと思う。piv分ずれているのだから、pivの倍数というところか

      offset = (n-r) % p

      for k in range(p-1, r, p):

        # 約分できる要素について割る

        numerator[k - offset]  /= pivot

        denominator[k] /= pivot

        

  ret = 1

  for k in range(r):

    if numerator[k] > 1: ret *= int(numerator[k])

      

  return ret



def nPr(n,r):

    tmp = 1

    for i in range(n,n-r,-1):

        tmp *= i

    return tmp



for i in range(1, K+1):

    sukima = nCr(N-K+1, i)

    p = nPr(K-1, i-1) // nPr(i-1, i-1)

    print((sukima*p%(10**9+7)))
from operator import mul

from functools import reduce



def nCr(n,r):



    r = min(n-r,r)

    if r == 0: return 1

    # reduceは第一引数で与えた関数を第二引数のiterbleのそれぞれで実行した結果をもどす

    over = reduce(mul, list(range(n, n - r, -1)), 1)

    under = reduce(mul, list(range(1,r + 1)), 1)

    return over // under







MOD = 10**9+7

N,K = list(map(int, input().split()))



for i in range(1, K+1):

    blue = nCr(K-1, i-1)

    red = nCr(N-K+1, i)

    if N-K+1 >= i:

       print((blue*red%MOD))

    else:

        print((0))
N, K = list(map(int, input().split()))


def nCr(n, r):
    if n < 0 or r < 0 or n < r:
        return 0
    if n - r < r:
        r = n - r
    if r == 0:
        return 1
    if r == 1:
        return n
    # 分子のn*(n-1)*...がr個分続くやつ
    numerator = [n - r + k + 1 for k in range(r)]
    # 分母：r!=r*(r-1)*...*3*2の要素
    denominator = [k + 1 for k in range(r)]
    # 分母の要素で割れる部分を割っていく部分
    for p in range(2, r + 1):
        # 分母は1,2,3,...rのようになっており、1は意味がないのでスキップした形か
        pivot = denominator[p - 1]
        if pivot > 1:
            # 分子のX番目と分母のX-offset番目が共通の約数を持つということだと思う。piv分ずれているのだから、pivの倍数というところか
            offset = (n - r) % p
            for k in range(p - 1, r, p):
                # 約分できる要素について割る
                numerator[k - offset] /= pivot
                denominator[k] /= pivot
    ret = 1
    for k in range(r):
        if numerator[k] > 1:
            ret *= int(numerator[k])
    return ret


def nPr(n, r):
    tmp = 1
    for i in range(n, n - r, -1):
        tmp *= i
    return tmp


for i in range(1, K + 1):
    sukima = nCr(N - K + 1, i)
    p = nPr(K - 1, i - 1) // nPr(i - 1, i - 1)
    print((sukima * p % (10**9 + 7)))

from operator import mul
from functools import reduce


def nCr(n, r):
    r = min(n - r, r)
    if r == 0:
        return 1
    # reduceは第一引数で与えた関数を第二引数のiterbleのそれぞれで実行した結果をもどす
    over = reduce(mul, list(range(n, n - r, -1)), 1)
    under = reduce(mul, list(range(1, r + 1)), 1)
    return over // under


MOD = 10**9 + 7
N, K = list(map(int, input().split()))
for i in range(1, K + 1):
    blue = nCr(K - 1, i - 1)
    red = nCr(N - K + 1, i)
    if N - K + 1 >= i:
        print((blue * red % MOD))
    else:
        print((0))

-N, K = list(map(int, input().split())) +from operator import mul +from functools import reduce -    if n < 0 or r < 0 or n < r: -        return 0 -    if n - r < r: -        r = n - r +    r = min(n - r, r) -    if r == 1: -        return n -    # 分子のn*(n-1)*...がr個分続くやつ -    numerator = [n - r + k + 1 for k in range(r)] -    # 分母：r!=r*(r-1)*...*3*2の要素 -    denominator = [k + 1 for k in range(r)] -    # 分母の要素で割れる部分を割っていく部分 -    for p in range(2, r + 1): -        # 分母は1,2,3,...rのようになっており、1は意味がないのでスキップした形か -        pivot = denominator[p - 1] -        if pivot > 1: -            # 分子のX番目と分母のX-offset番目が共通の約数を持つということだと思う。piv分ずれているのだから、pivの倍数というところか -            offset = (n - r) % p -            for k in range(p - 1, r, p): -                # 約分できる要素について割る -                numerator[k - offset] /= pivot -                denominator[k] /= pivot -    ret = 1 -    for k in range(r): -        if numerator[k] > 1: -            ret *= int(numerator[k]) -    return ret +    # reduceは第一引数で与えた関数を第二引数のiterbleのそれぞれで実行した結果をもどす +    over = reduce(mul, list(range(n, n - r, -1)), 1) +    under = reduce(mul, list(range(1, r + 1)), 1) +    return over // under -def nPr(n, r): -    tmp = 1 -    for i in range(n, n - r, -1): -        tmp *= i -    return tmp - - +MOD = 10**9 + 7 +N, K = list(map(int, input().split())) -    sukima = nCr(N - K + 1, i) -    p = nPr(K - 1, i - 1) // nPr(i - 1, i - 1) -    print((sukima * p % (10**9 + 7))) +    blue = nCr(K - 1, i - 1) +    red = nCr(N - K + 1, i) +    if N - K + 1 >= i: +        print((blue * red % MOD)) +    else: +        print((0))