import java.util.HashMap;

public class FibonacciRapide {

	private static int indentation;
	private static HashMap<Long, Long> buffer = new HashMap<>();

	public static long fibo(long indice) {
		if (indice == 0) {
			return 0;
		} else if (indice == 1) {
			return 1;
		} else {
			if (buffer.containsKey(indice)) {
				return buffer.get(indice);
			}
			for (int i = 0; i < indentation; i++) {
	            System.out.print("  ");
	        }
	        System.out.println("Terme n°"+indice);
	        indentation++;
			long result = fibo(indice - 1) + fibo(indice - 2);
			buffer.put(indice, result);
			for (int i = 0; i < indentation-1; i++) {
	            System.out.print("  ");
	        }
            indentation--;
            System.out.println("Résultat du calcul:  "+result);

			return result;
		}
	}

	public static void main(String args[]) {
		long indicemax = Long.parseUnsignedLong(args[0]);
		indentation=0;
		System.out.println("Le terme n°" + indicemax + " de la suite de Fibonacci est égal à " + fibo(indicemax));
	}
}
