Cod sursa(job #2183339)

Utilizator alexandrumeterezAlexandru Meterez alexandrumeterez Data 23 martie 2018 01:36:07
Problema Iepuri Scor 0
Compilator java Status done
Runda Arhiva de probleme Marime 2.06 kb
import java.io.*;
import java.util.Scanner;

class Main {
    static int T;
    static int X, Y, Z;
    static int A, B, C;
    static int N;

    static String inputFile = "iepuri.in";
    static String outputFile = "iepuri.out";

    public static long[][] matrixMultiply(long[][] mat1, long[][] mat2, int size) {
        long[][] res = new long[size][size];

        for (int i = 0; i < size; ++i) {
            for (int j = 0; j < size; ++j) {
                long sum = 0;
                for (int k = 0; k < size; ++k) {
                    sum += 1L * mat1[i][k] * mat2[k][j];
                }

                res[i][j] = sum;
            }
        }

        return res;
    }

    public static long[][] matrixPower(long[][] A, long exp, int size) {
        if (exp == 0)
            return new long[][]{{1, 0}, {0, 1}};
        else if (exp == 1)
            return A;

        if (exp % 2 == 0) {
            long[][] temp = matrixPower(A, exp / 2, size);
            return matrixMultiply(temp, temp, size);
        } else if (exp % 2 == 1) {
            long[][] temp = matrixPower(A, (exp - 1) / 2, size);
            return matrixMultiply(matrixMultiply(temp, A, size), temp, size);
        }

        return A;
    }

    public static long solve() {
        long[][] M = new long[][]{{0, 1, 0}, {0, 0, 1}, {C, B, A}};
        long[][] res = matrixPower(M, N, 3);

        long sum = 0;
        sum = res[0][0] * X + res[0][1] * Y + res[0][2] * Z;


        return sum;

    }

    public static void main(String[] args) throws IOException {


        Scanner scanner = new Scanner(new File(inputFile));
        PrintWriter pw = new PrintWriter(new File(outputFile));
        T = scanner.nextInt();

        for (int i = 0; i < T; ++i) {
            X = scanner.nextInt();
            Y = scanner.nextInt();
            Z = scanner.nextInt();
            A = scanner.nextInt();
            B = scanner.nextInt();
            C = scanner.nextInt();
            N = scanner.nextInt();
            long sum = solve();
            pw.printf("%d\n", sum);

        }

        pw.close();
    }

}