Problem: Numbers k-bonacci (k is integer, k > 1) are a generalization of Fibonacci numbers and are determined as follows:

  * F(k, n) = 0, for integer n, 1 ≤ n < k; 
  * F(k, k) = 1; 
  * F(k, n) = F(k, n - 1) + F(k, n - 2) + ... + F(k, n - k), for integer n, n > k. 



Note that we determine the k-bonacci numbers, F(k, n), only for integer values of n and k.

You've got a number s, represent it as a sum of several (at least two) distinct k-bonacci numbers. 

Input

The first line contains two integers s and k (1 ≤ s, k ≤ 109; k > 1).

Output

In the first line print an integer m (m ≥ 2) that shows how many numbers are in the found representation. In the second line print m distinct integers a1, a2, ..., am. Each printed integer should be a k-bonacci number. The sum of printed integers must equal s.

It is guaranteed that the answer exists. If there are several possible answers, print any of them.

Examples

Input

5 2


Output

3
0 2 3


Input

21 5


Output

3
4 1 16

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:60000000")
using namespace std;
struct debugger {
  template <typename T>
  debugger& operator,(const T& v) {
    cerr << v << "\t";
    return *this;
  }
} dbg;
template <class T>
void setmax(T& a, T b) {
  if (a < b) a = b;
}
template <class T>
void setmin(T& a, T b) {
  if (b < a) a = b;
}
template <class T>
T Abs(T x) {
  return x > 0 ? x : -x;
}
template <class T>
inline T sqr(T x) {
  return x * x;
}
template <class T>
inline T Mod(T n, T m) {
  return (n % m + m) % m;
}
template <class T>
string toString(T n) {
  ostringstream oss;
  oss << n;
  oss.flush();
  return oss.str();
}
int toInt(string s) {
  int r = 0;
  istringstream sin(s);
  sin >> r;
  return r;
}
bool isVowel(char ch) {
  ch = tolower(ch);
  if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u')
    return true;
  return false;
}
bool isUpper(char c) { return c >= 'A' && c <= 'Z'; }
bool isLower(char c) { return c >= 'a' && c <= 'z'; }
long long Pow(long long B, long long P) {
  long long R = 1;
  while (P > 0) {
    if (P % 2 == 1) R = (R * B);
    P /= 2;
    B = (B * B);
  }
  return R;
}
int BigMod(long long B, long long P, long long M) {
  long long R = 1;
  while (P > 0) {
    if (P % 2 == 1) {
      R = (R * B) % M;
    }
    P /= 2;
    B = (B * B) % M;
  }
  return (int)R;
}
void binprint(long long mask, long long n) {
  long long i;
  string s = "";
  do {
    s += (mask % 2 + '0');
    mask /= 2;
  } while (mask);
  reverse(s.begin(), s.end());
  s = string(max(n - (int)s.size(), 0LL), '0') + s;
  for (i = (int)s.size() - n; i < (int)s.size(); i++) printf("%c", s[i]);
  printf("\n");
}
void ASCII_Chart() {
  int i, j, k;
  printf("ASCII Chart:(30-129)\n");
  for (i = 30; i < 50; i++) {
    for (j = 0; j < 5; j++) {
      k = i + j * 20;
      printf("%3d---> '%c'   ", k, k);
    }
    printf("\n");
  }
}
struct pq {
  int item, mask;
  pq(int _item = 0, int _mask = 0) {
    item = _item;
    mask = _mask;
  }
};
pq arr2[5000000];
bool comp(pq a, pq b) { return a.item < b.item; }
vector<int> store, arr1;
int N, M, MM;
void generate(long long k, long long s) {
  int i, j, sum;
  store.clear();
  store.push_back(1);
  for (i = 1; i < 1000; i++) {
    sum = 0;
    for (j = 1; j <= k; j++) {
      if (i - j < 0) break;
      sum += store[i - j];
      if (sum > s) break;
    }
    if (sum > s) break;
    store.push_back(sum);
  }
}
int BinarySearch(int item) {
  int low = 0, high = (1 << (MM)), mid;
  while (low < high) {
    mid = (low + high) / 2;
    if (arr2[mid].item < item)
      low = mid + 1;
    else
      high = mid;
  }
  if (arr2[low].item == item) return arr2[low].mask;
  return -1;
}
int main() {
  int i, j, test, Case = 1, s, k, sum, val, ind;
  vector<int> ans;
  while (scanf("%d %d", &s, &k) == 2) {
    generate(k, s);
    N = (int)store.size();
    sort(store.begin(), store.end());
    ind = N - 1;
    ans.clear();
    while (s) {
      if (s - store[ind] >= 0) {
        ans.push_back(store[ind]);
        s -= store[ind];
      }
      ind--;
    }
    if ((int)ans.size() < 2) ans.push_back(0);
    printf("%d\n", (int)ans.size());
    for (i = 0; i < (int)ans.size(); i++) printf("%d ", ans[i]);
    printf("\n");
  }
  return 0;
}