<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">package deagif;

import java.math.BigInteger;
import java.util.Scanner;

public class HillDecrypt {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		// ç§˜é’¥çŸ©é˜µ
		int[][] A = {
			{ 1, 1, 0 },
			{ 2, 1, 1 },
			{ 3, 2, 2 },
		};
		A = Inverse(A);

		System.out.print("è¯·è¾“å…¥å¯†æ–‡:");
		String line = input.nextLine();

		// å°†å­—ç¬¦è½¬æ¢æˆå¤§å†™
		line = line.toUpperCase();
		String[] lines = line.split("");

		int n = (int) Math.ceil(lines.length / 3.0);
		int[][][] oriMatrix = new int[n][3][1];

		// æŒ‰ç…§ASCIIç&nbsp;è¡¨è½¬æ¢æ•°å­—ï¼Œå¯¼å…¥çŸ©é˜µ
		for (int i = 1; i &lt;= lines.length; i++) {
			String s = lines[i - 1];

			int unicode = (int) s.charAt(0);
			unicode -= 64;

			oriMatrix[(i - 1) / 3][(i - 1) % 3][0] = unicode;
		}

		int[][][] resultMatrix = new int[n][3][1];

		// æ&nbsp;¹æ®ç§˜é’¥ä½œçŸ©é˜µä¹˜æ³•
		int index = 0;
		for (int[][] rMatrix : oriMatrix) {
			int[][] outMatrix = MatrixMultiply(A, rMatrix);
			resultMatrix[index] = outMatrix;

			index++;
		}

		for (int i = 0; i &lt; n; i++) {
			for (int k = 0; k &lt; 3; k++) {
				int num = resultMatrix[i][k][0] % 26;
				while(num &lt; 0) {
					num += 26;
				}
				if(num == 0) {
					if(i &lt; n-1 || k &lt; 2) {
						num += 26;
					}
				}
				System.out.print((char) (num+ 64));
			}
		}
	}
	
	// è®¡ç®—çŸ©é˜µçš„é€†
    public static int[][] Inverse(int[][] matrix) {
        int n = matrix.length;
        int[][] augmentedMatrix = new int[n][2 * n];

        // æž„å»ºå¢žå¹¿çŸ©é˜µ [matrix | identity]
        for (int i = 0; i &lt; n; i++) {
            for (int j = 0; j &lt; n; j++) {
                augmentedMatrix[i][j] = matrix[i][j];
                augmentedMatrix[i][j + n] = (i == j) ? 1 : 0; // å•ä½çŸ©é˜µéƒ¨åˆ†
            }
        }

        // åˆ©ç”¨é«˜æ–¯-çº¦å½“æ¶ˆå…ƒæ³•è¿›è¡Œè¡Œå˜æ¢
        for (int i = 0; i &lt; n; i++) {
            // å°†ä¸»å…ƒå½’ä¸€åŒ–ä¸º1
            int pivot = augmentedMatrix[i][i];
            for (int j = 0; j &lt; 2 * n; j++) {
                augmentedMatrix[i][j] /= pivot;
            }

            // æ¶ˆå…ƒæ“ä½œï¼Œä½¿å¾—ç¬¬ i åˆ—å…¶ä»–å…ƒç´&nbsp;å˜ä¸º0
            for (int k = 0; k &lt; n; k++) {
                if (k != i) {
                    int factor = augmentedMatrix[k][i];
                    for (int j = 0; j &lt; 2 * n; j++) {
                        augmentedMatrix[k][j] -= factor * augmentedMatrix[i][j];
                    }
                }
            }
        }

        // æå–é€†çŸ©é˜µéƒ¨åˆ†å¹¶è¿”å›ž
        int[][] inverseMatrix = new int[n][n];
        for (int i = 0; i &lt; n; i++) {
            for (int j = 0; j &lt; n; j++) {
                inverseMatrix[i][j] = augmentedMatrix[i][j + n];
            }
        }

        return inverseMatrix;
    }

	// çŸ©é˜µçš„ä¹˜æ³•è¿ç®—
	public static int[][] MatrixMultiply(int[][] A, int[][] B) {
		int aR = A.length;
		int aC = A[0].length; // ==bR

		int bC = B[0].length;

		if (aC != B.length) {
			System.out.println("Açš„åˆ—æ•°!=Bçš„è¡Œæ•°ï¼Œæ—&nbsp;æ³•ç›¸ä¹˜");
			return null;
		}

		int[][] C = new int[aR][bC];

		// ä¹˜æ³•è¿ç®—(å·¦è¡Œå³åˆ—åŠ&nbsp;å’Œ)
		for (int i = 0; i &lt; aR; i++) {
			for (int j = 0; j &lt; bC; j++) {
				int sum = 0;
				for (int k = 0; k &lt; aC; k++) {
					sum += A[i][k] * B[k][j];
				}
				C[i][j] = sum;
			}
		}

		return C;
	}
}</pre></body></html>