| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
求大神帮忙,为何3420一直Run Time Rrror QAQimport java.util.Scanner;
public class Main {
static int N;
static int M;
static long[][] matrix;
// An+4 =An+3 + 5*An+2 +An+1 -An
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
N = scan.nextInt();
M = scan.nextInt();
matrix = new long[4][4];
while (M != 0 || N != 0) {
long result = solve();
System.out.println(result);
N = scan.nextInt();
M = scan.nextInt();
}
scan.close();
}
private static long solve() {
if (N == 1) {
return 1 % M;
}
if (N == 2) {
return 5 % M;
}
if (N == 3) {
return 11 % M;
}
matrix[0][0] = 1;
matrix[0][1] = 5;
matrix[0][2] = 1;
matrix[0][3] = -1;
for (int i = 1; i < matrix.length; i++) {
matrix[i][i - 1] = 1;
}
matrix = pow(matrix, N - 3);
long[][] init = { { 11 }, { 5 }, { 1 }, { 1 } };
matrix = mul(matrix, init);
return matrix[0][0];
}
private static long[][] mul(long[][] matA, long[][] matB) {
long[][] matrix = new long[matA.length][matB[0].length];
for (int i = 0; i < matA.length; i++) {
for (int j = 0; j < matB[0].length; j++) {
for (int k = 0; k < matA[0].length; k++) {
matrix[i][j] = (matrix[i][j] + matA[i][k] * matB[k][j]) % M;
}
}
}
return matrix;
}
private static long[][] pow(long[][] mat, int n) {
long[][] matrix = new long[mat.length][mat[0].length];
for (int i = 0; i < matrix.length; i++) {
matrix[i][i] = 1;
}
while (n > 0) {
if ((n & 1) == 1) {
matrix = mul(mat, matrix);
}
mat = mul(mat, mat);
n >>= 1;
}
return matrix;
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator