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 JAVA):

Solution:
import java.io.*;
import java.math.BigInteger;
import java.util.*;

public class CodeForces {
    Set<Long> dp;
    Set<Long> taken;
    List<Long> res;

    boolean go(long s, List<Long> fnum) {
        if (dp.contains(s))
            return false;
        dp.add(s);
        for (int i = fnum.size() - 1; i >= 0; --i) {
            if (fnum.get(i) > s || taken.contains(fnum.get(i)))
                continue;
            if (fnum.get(i) == s) {
                res.add(fnum.get(i));
                return true;
            }
            taken.add(fnum.get(i));
            if (go(s - fnum.get(i), fnum)) {
                res.add(fnum.get(i));
                return true;
            }
            taken.remove(fnum.get(i));
        }
        return false;
    }

    void runCase(int caseNum) throws IOException {
        long s = nextLong();
        int k = nextInt();

        long[] sum = new long[100000];
        sum[0] = 0;
        sum[1] = 1;
        List<Long> fnum = new ArrayList<Long>();
        fnum.add((long)1);
        for (int i = 2; i < 1000000; ++i) {
            int pre = i - k - 1;
            if (pre < 0)
                pre = 0;
            long cur = sum[i - 1] - sum[pre];
            if (cur > s)
                break;
            if (cur > 1)
                fnum.add(cur);
            sum[i] = sum[i - 1] + cur;
        }
        dp = new HashSet<Long>();
        res = new ArrayList<Long>();
        taken = new HashSet<Long>();
        go(s, fnum);
        if (res.size() < 2)
            res.add((long)0);
        out.println(res.size());
        for (int i = 0; i < res.size(); ++i) {
            if (i > 0)
                out.print(" ");
            out.print(res.get(i));
        }
        out.println();
    }


    public static void main(String[] args) throws IOException {
        if (System.getProperty("ONLINE_JUDGE") != null){
            in = new BufferedReader(new InputStreamReader(System.in));
            out = new PrintWriter(System.out);
        }else{
            in = new BufferedReader(new FileReader("input.txt"));
            out = new PrintWriter("output.txt");
        }
        new CodeForces().runIt();
        out.flush();
        out.close();
        return;
    }

    static BufferedReader in;
    private StringTokenizer st;
    static PrintWriter out;

    String next() throws IOException {
        while (!st.hasMoreTokens()) {
            String line = in.readLine();
            if (line == null) {
                return null;
            }
            st = new StringTokenizer(line, " ");
        }
        return st.nextToken();
    }

    int nextInt() throws IOException {
        return Integer.parseInt(next());
    }

    double nextDouble() throws IOException {
        return Double.parseDouble(next());
    }

    long nextLong() throws IOException {
        return Long.parseLong(next());
    }


    void runIt() throws IOException {
        st = new StringTokenizer("");

//        int N = nextInt();
//        for (int i = 0; i < N; i++) {
//            runCase(i + 1);
//        }
        runCase(0);

        out.flush();
    }

}