1.题目
牛客网链接:星际密码__牛客网
星际战争开展了100年之后,NowCoder终于破译了外星人的密码!他们的密码是一串整数,通过一张表里的信息映射成最终4位密码。表的规则是:n对应的值是矩阵X的n次方的左上角,如果这个数不足4位则用0填充,如果大于4位的则只输出最后4位。
|1 1|^n => |Xn ..|
|1 0| |.. ..|
例如n=2时,
|1 1|^2 => |1 1| * |1 1| => |2 1|
|1 0| |1 0| |1 0| |1 1|
即2对应的数是“0002”。
2.解析
读懂题意:
这里我们进行的是矩阵的乘法运算,矩阵乘法运算规则如下:
题目中的n对应的是某个举证的n次方:
我们找到规律:
这样我们就可以使用斐波那契数列来解题了。
3.代码
import java.util.*;
/**
* Describe:牛客网链接:https://www.nowcoder.com/questionTerminal/34f17d5f2a8240bea661a23ec095a062
*
* 星际战争开展了100年之后,NowCoder终于破译了外星人的密码!他们的密码是一串整数,通过一张表里的信息映射成最终4位密码。表的规则是:n对应的值是矩阵X的n次方的左上角,如果这个数不足4位则用0填充,如果大于4位的则只输出最后4位。
* |1 1|^n => |Xn ..|
* |1 0| |.. ..|
* 例如n=2时,
* |1 1|^2 => |1 1| * |1 1| => |2 1|
* |1 0| |1 0| |1 0| |1 1|
* 即2对应的数是“0002”。
*
* User:lenovo
* Date:2023-04-17
* Time:11:15
*/
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int[] array = new int[10001];
array[1] = 1;
array[2] = 2;
for(int i = 3; i < 10001; i++) {
array[i] = array[i - 1] + array[i - 2];
array[i] = array[i] % 10000;//保留四位数字即可,不影响最后结果
}
// 注意 hasNext 和 hasNextLine 的区别
while (scan.hasNextInt()) { // 注意 while 处理多个 case
int n = scan.nextInt();
int[] nums = new int[n];
for(int i = 0; i < n; i++) {
nums[i] = scan.nextInt();
}
StringBuilder ret = new StringBuilder();
for(int i = 0; i < n; i++) {
int num = nums[i];
ret.append(String.format("%04d", array[num]));
}
System.out.println(ret.toString());
}
}
}