Cod sursa(job #2595523)

Utilizator nick.cocont nou nick.co Data 7 aprilie 2020 20:50:39
Problema Al k-lea termen Fibonacci Scor 100
Compilator java Status done
Runda Arhiva educationala Marime 1.18 kb
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;

public class Main {
	public static final String IN_FILE = "kfib.in";
	public static final String OUT_FILE = "kfib.out";
	public static int MOD = 666013;
	
	public static long[] mult(long[] a, long[] b) {
		long[] aux = {
			((a[0] * b[0]) % MOD + (a[1] * b[2]) % MOD) % MOD,
			((a[0] * b[1]) % MOD + (a[1] * b[3]) % MOD) % MOD,
			((a[2] * b[0]) % MOD + (a[3] * b[2]) % MOD) % MOD,
			((a[2] * b[1]) % MOD + (a[3] * b[3]) % MOD) % MOD
		};
		return aux;
	}
	
	public static long[] pow_log(long[] a, int e) {
		long[] aux = {1, 0, 0, 1};
		if (e == 0) {
			return aux;
		}
		if (e == 1) {
			return a;
		}
		aux = pow_log(a, e / 2);
		aux = mult(aux, aux);
		if (e % 2 == 1) {
			aux = mult(aux, a);
		}
		return aux;
	}
	
	public static void main(String[] args) throws IOException {
		long[] fibs = {1, 1, 1, 0};
		
		Scanner scanner = new Scanner(new FileInputStream(IN_FILE));
		
		int numIn = scanner.nextInt();
		
		scanner.close();
		
		PrintStream printer = new PrintStream(OUT_FILE);
		
		long[] res = pow_log(fibs, numIn);
		
		printer.println(res[1]);
		
		printer.close();
	}

}