import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Euler755 {
    static long S(long n) {
        List<Long> fib = new ArrayList<>();
        fib.add(1L);
        fib.add(2L);
        while (fib.get(fib.size() - 1) + fib.get(fib.size() - 2) <= n) {
            fib.add(fib.get(fib.size() - 1) + fib.get(fib.size() - 2));
        }

        long[] prefix = new long[fib.size()];
        long running = 0L;
        for (int i = 0; i < fib.size(); ++i) {
            running += fib.get(i);
            prefix[i] = running;
        }

        List<Map<Long, Long>> memo = new ArrayList<>(fib.size());
        for (int i = 0; i < fib.size(); ++i) {
            memo.add(new HashMap<>());
        }

        return dfs(fib.size() - 1, n, fib, prefix, memo);
    }

    static long dfs(int i, long limit, List<Long> fib, long[] prefix, List<Map<Long, Long>> memo) {
        if (i < 0) {
            return 1L;
        }
        if (limit >= prefix[i]) {
            return 1L << (i + 1);
        }

        Map<Long, Long> mp = memo.get(i);
        Long cached = mp.get(limit);
        if (cached != null) {
            return cached;
        }

        long total = dfs(i - 1, limit, fib, prefix, memo);
        if (limit >= fib.get(i)) {
            total += dfs(i - 1, limit - fib.get(i), fib, prefix, memo);
        }

        mp.put(limit, total);
        return total;
    }

    public static String solve() {
        return Long.toString(S(10000000000000L));
    }

    public static void main(String[] args) {
        System.out.println(solve());
    }
}
