#include <bits/stdc++.h>
#pragma comment(linker, "/stack:640000000")
using namespace std;
int fx[] = {0, 0, -1, 1, -1, 1, 1, -1};
int fy[] = {1, -1, 0, 0, 1, 1, -1, -1};
struct debugger {
  template <typename T>
  debugger& operator,(const T& v) {
    cerr << v << " ";
    return *this;
  }
} dbg;
const int N = (int)1e5 + 10;
vector<int> graph[N];
vector<long long int> vec;
int cnt;
long long int n, k;
void call(int taken, int pos) {
  if (pos == 0) {
    printf("1 ");
    cnt++;
    if (cnt == 100000) {
      printf("\n");
      exit(0);
    }
    return;
  }
  if ((long long int)taken == k) {
    cnt++;
    printf("%lld ", vec[pos]);
    if (cnt == 100000) {
      printf("\n");
      exit(0);
    }
    return;
  }
  for (auto v : graph[pos]) call(taken + 1, v);
}
int main() {
  while (scanf("%lld%lld", &n, &k) == 2) {
    if (n != 1 && k >= 100000) {
      for (int i = 0; i < 100000; i++) printf("1 ");
      printf("\n");
      continue;
    }
    for (long long int i = 1; i * i <= n; i++) {
      if (n % i == 0) {
        vec.push_back(i);
        if (n / i != i) vec.push_back(n / i);
      }
    }
    sort(vec.begin(), vec.end());
    for (int i = 0; i < vec.size(); i++) {
      for (int j = 0; j <= i; j++) {
        if (vec[i] % vec[j] == 0) graph[i].push_back(j);
      }
    }
    call(0, vec.size() - 1);
    printf("\n");
  }
  return 0;
}
