﻿/*
 * Sadik Kuzu 11.2008
 *
 * Soruda gecen durum Zeckendorf Teoremi'dir
 * http://en.wikipedia.org/wiki/Zeckendorf%27s_theorem
 * Hatta soruda sadece existence'dan bahsedilmi$
 * teorem uniqueness'i da iceriyor.
 *
 * Cozum icin $u yolu izledim:
 * (fibonacci.gir'deki pozitif tam sayi N olsun)
 *
 * Once N'e kadarki Fibonacci sayilarini
 * azalan sirayla bir ArrayList'e doldurdum (fibs)
 * (N'den kucuk en buyuk Fibonacci sayisi f0 olsun)
 *
 * Greedy algorithm ile
 * f0'i fibonacci.cik'a yazdim
 * N-f0 icin de teorem gecerli oldugu icin
 * arraylist'te kalan en buyuk sayi
 * (N-fn)'den kucukse yazdim, degilse bir sonraki...
 * ta ki bu cikarmalar sifira ula$ana dek...
 */

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;

public class Fibonacci {

    public static void main(String[] args) {
        long N = 0;
        long fibs_arraylist_siradaki;

        try {
            BufferedReader in = new BufferedReader(new FileReader(
                    "fibonacci.gir"));
            N = Long.parseLong(in.readLine());
        } catch (FileNotFoundException e) {
            N = 0;
        } catch (NumberFormatException e) {
            N = 0;
        } catch (IOException e) {
            N = 0;
        }

        PrintWriter out;
        try {
            out = new PrintWriter(new FileWriter("fibonacci.cik"));
            if (N > 0) {
                ArrayList<Long> al = fibs(N);
                do {
                    fibs_arraylist_siradaki = al.remove(0);
                    if (N >= fibs_arraylist_siradaki) {
                        out.print(fibs_arraylist_siradaki + " ");
                        N -= fibs_arraylist_siradaki;
                    }
                } while (N > 0);
            } else {
                out.print("Hata olustu.");
            }
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static ArrayList<Long> fibs(long target) {
        ArrayList<Long> al = new ArrayList<Long>();
        long bir, iki, toplam;
        bir = iki = toplam = 1;

        do {
            al.add(toplam);
            toplam = bir + iki;
            bir = iki;
            iki = toplam;
        } while (toplam <= target);

        Collections.reverse(al);
        return al;
    }

}
