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

public class Euler297 {
    static class Solver {
        List<Long> fib;
        Map<Long, Long> memo;

        Solver() {
            fib = new ArrayList<>();
            fib.add(1L);
            fib.add(2L);
            while (fib.get(fib.size() - 1) < 1000000000000000000L) {
                long n = fib.get(fib.size() - 1) + fib.get(fib.size() - 2);
                fib.add(n);
            }
            memo = new HashMap<>();
        }

        long solve(long n) {
            memo.clear();
            return S(n);
        }

        long S(long n) {
            if (n <= 4) {
                return n - 1;
            }
            if (memo.containsKey(n)) {
                return memo.get(n);
            }

            int lb = 0;
            // binary search equivalent
            int l = 0, r = fib.size() - 1;
            while (l <= r) {
                int mid = l + (r - l) / 2;
                if (fib.get(mid) >= n) {
                    lb = mid;
                    r = mid - 1;
                } else {
                    l = mid + 1;
                }
            }

            long p = fib.get(lb - 1);
            long value = S(p) + (n - p) + S(n - p);
            memo.put(n, value);
            return value;
        }
    }

    public static String solve() {
        Solver solver = new Solver();
        return String.valueOf(solver.solve(100000000000000000L));
    }

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