Cod sursa(job #2219081)

Utilizator danielNiculaeDaniel Niculae danielNiculae Data 7 iulie 2018 01:40:20
Problema Al k-lea termen Fibonacci Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 1.97 kb
package algtest;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class OptimalInfoarena {

    final static int DIMENSION_SIZE = 2;

    private static BigInteger[][] multiply2DMatrices(BigInteger a[][], BigInteger b[][]) {
        BigInteger[][] c = new BigInteger[DIMENSION_SIZE][DIMENSION_SIZE];
        for( int i = 0 ; i < DIMENSION_SIZE ; ++i) {
            for( int j = 0 ; j < DIMENSION_SIZE ; ++j) {
                c[i][j] = new BigInteger("0");
                for( int k = 0 ; k < DIMENSION_SIZE ; ++k) {
                    c[i][j] = c[i][j].add(a[i][k].multiply(b[k][j]));
                }
            }
        }
        return c;
    }

    private static BigInteger optimalSolution(int n) {
        BigInteger[][] alpha = {{new BigInteger("1"), new BigInteger("1")},
                {new BigInteger("1"), new BigInteger("0")}};
        BigInteger[][] termMatrix = {{new BigInteger("1"), new BigInteger("0")},
                {new BigInteger("0"), new BigInteger("0")}};
        int power_of_alpha = n - 1;
        while(power_of_alpha > 0) {
            if(power_of_alpha % 2 == 1) {
                termMatrix = multiply2DMatrices(termMatrix, alpha);
            }
            alpha = multiply2DMatrices(alpha, alpha);
            power_of_alpha /= 2;
        }
        return termMatrix[0][0];
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("inout/kfib.in"));
        String firstLine = br.readLine();
        Matcher matcher = Pattern.compile("\\d+").matcher(firstLine);
        matcher.find();
        int firstValue = Integer.valueOf(matcher.group());

        PrintWriter writer = new PrintWriter("inout/kfib.out", "UTF-8");
        writer.println(optimalSolution(firstValue).mod(new BigInteger(("666013"))));
        writer.close();
    }

}