1. 题目来源
链接:星际密码
来源:牛客网
2. 题目说明
星际战争开展了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”。
输入描述:
输入有多组数据。
每组数据两行:第一行包含一个整数n (1≤n≤100);第二行包含n个正整数Xi (1≤Xi≤10000)
输出描述:
对应每一组输入,输出一行相应的密码。
示例:
输入
6
18 15 21 13 25 27
5
1 10 100 1000 10000
输出
418109877711037713937811
00010089410135017501
3. 题目解析
这个题目首先需要明确矩阵是固定的,其次是矩阵相乘的方法
矩阵相乘
[
a
1
a
2
b
1
b
2
]
∗
[
c
1
c
2
d
1
d
2
]
=
[
a
1
c
1
+
a
2
d
1
a
1
c
2
+
a
2
d
2
b
1
c
1
+
b
2
d
1
b
1
d
2
+
b
2
d
2
]
\left[ \begin{matrix} a_1 & a_2 \\ b_1 & b_2 \end{matrix} \right] *\left[ \begin{matrix} c_1 & c_2 \\ d_1 & d_2 \end{matrix} \right]=\left[ \begin{matrix} a_1c_1 + a_2d_1 & a_1c_2 + a_2d_2 \\ b_1c_1 + b_2d_1 & b_1d_2 + b_2d_2 \end{matrix} \right]
[a1b1a2b2]∗[c1d1c2d2]=[a1c1+a2d1b1c1+b2d1a1c2+a2d2b1d2+b2d2]
[
1
1
1
0
]
2
=
[
2
1
1
1
]
\left[ \begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right] ^2= \left[ \begin{matrix} 2 & 1 \\ 1 & 1 \end{matrix} \right]
[1110]2=[2111]
n的取值:1 2 3 4 5 6 …
左上角值:1 2 3 5 8 13 …
是一 个变式的斐波那契。
这个规律并不好找,可以通过枚举法来寻找其中数字规律。
4. 代码展示
// write your code here cpp
#include <bits/stdc++.h>
using namespace std;
vector<int> a = {1, 1};
void datainit() {
for (int i = 2; i < 10005; ++i)
a.push_back((a[i - 1] + a[i - 2]) % 10000); // 变式斐波拉切数列
}
int main() {
int n, t;
datainit();
while (cin >> n) {
while (n--) {
cin >> t;
printf("%04d", a[t]);
}
cout << endl;
}
return 0;
}