[每日一题] 49. 星际密码(变式斐波那切数列、数学、找规律)

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值