Cod sursa(job #1923763)

Utilizator blu3pirateNancu Cristian blu3pirate Data 12 martie 2017 01:09:15
Problema Al k-lea termen Fibonacci Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 1.16 kb
import java.util.Scanner;

public class Main {

    private static final long[] A = new long[] {0, 1, 1, 1};
    private static final long[] I = new long[] {1, 0, 0, 1};
    private static final int MOD = 666013;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        long[] result = computePower(n);
        System.out.println(result[1]);
    }

    private static long[] computePower(int n) {
        if(n == 1)
            return A;
        if(n == 0)
            return I;
        if(n % 2 == 1) {
            long[] res = computePower((n - 1) / 2);
            return multiply(A, multiply(res, res));
        }
        long[] res = computePower(n / 2);
        return multiply(res, res);
    }

    private static long[] multiply(long[] A, long[] B) {
        long[] C = new long[4];
        C[0] = (A[0] * B[0] % MOD + A[1] * B[2] % MOD) % MOD;
        C[1] = (A[0] * B[1] % MOD + A[1] * B[3] % MOD) % MOD;
        C[2] = (A[2] * B[0] % MOD + A[3] * B[2] % MOD) % MOD;
        C[3] = (A[2] * B[1] % MOD + A[3] * B[3] % MOD) % MOD;

        return C;
    }
}