矩阵入门总结

本文总结了矩阵在递推和状态转换中的优化应用,包括线性递推、状态压缩DP和AC自动机。介绍了矩阵快速幂、等比矩阵求和等常见技巧,并列举了多个相关题目进行实践说明,强调确定递推关系是关键,同时提醒注意矩阵乘法的优化和负数处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


利用矩阵乘法可以将一个“向量”转换成另一个“向量”,若每一次转换的方式都是固定的话,那么就可以用多次乘一个中间矩阵A来达到将初始“向量”转换多次,相当于先求A的n次方,而求矩阵A的n次方可以用二分倍增来加速,这就是矩阵操作的意义所在,也就定义了矩阵快速幂这样一个操作的辅助作用。

和数据结构一样,矩阵也是“需要用时才用”,不能为了用矩阵而用矩阵,这偏离了解决问题的本质。


矩阵优化线性递推,根据初始状态以及递推式确立中间矩阵A,再通过快速幂求取第n项等。一些常见的中间矩阵的建法需要知道,比如说求矩阵和,等比矩阵和等。。。

矩阵优化状态递推,在有限的状态中可以通过某种方式进行转换成有限状态中的其他状态,比如状态压缩dp的状态转换,AC自动机的状态转换(还有待深入学习AC自动机),同样的在确定状态转换机制后建立中间矩阵A,通过快速幂获取n次转换后的状态


所以对于矩阵操作来说,最重要的最难的并不在于矩阵的操作,而是确定递推,不管是线性递推,还是状态递推等


矩阵乘法需要注意的一些东西:

1.一般矩阵乘法是O(n^3),可以通过在第三重循环前判断一个因子是否为0来避免第三重循环,这在做稀疏矩阵乘法时效率提升明显

2.循环矩阵,从第二行开始,每一行可以通过某种规则从上一行得出本行,则乘法的时候先O(n^2)求出第一行,在O(n^2)求出其他行,一般循环矩阵的题目都会卡这点的复杂度

3.若矩阵较大,则所有函数中不要定义矩阵,不要直接传递矩阵参数(用指针或引用),将所有用到的矩阵全定义成全集变量,不然会爆栈

4.一般涉及到矩阵操作都会求模,若矩阵中有负数,则一定要记着判断最后结果是否为负,题目要求正数结果则应+mod再%mod


目前做的一些题目:

hdu 1575 Tr A(矩阵操作入门)

poj 3233 Matrix Power Series(等比矩阵求和)

hdu 1588 Gauss Fibonacci(函数嵌套、转换、等比矩阵求和)

poj 3070 Fibonacci(矩阵优化递推入门)

hdu 2256 Problem of Precision(矩阵快速幂,得出递推式有难度)

fzu 1683 纪念SlingShot (矩阵优化递推,递推矩阵求和)

poj 3735 Training little cats(关键是想到构建中间矩阵)

poj 1977 Odd Loving Bakers(矩阵)

poj 2663 Tri Tiling(递推)

poj 3420 Quad Tiling(状态压缩矩阵递推)

poj 2440 DNA(状态压缩递推+矩阵)

hdu 2604 Queuing(状态压缩递推,矩阵)

hdu 1757 A Simple Math Problem(矩阵优化递推)

hdu 2276 Kiki & Little Kiki 2(矩阵优化递推)

fzu 1692 Key problem(循环同构矩阵o(n^2)优化乘法)

hdu 2429 Word Game(矩阵)

uva 10870 Recurrences(矩阵优化递推)

la 3704 - Cellular Automaton(矩阵优化递推)


<think>好的,我现在需要帮助用户了解或实现得物签名的相关技术,特别是签名算法的实现方式。首先,我需要收集已有的信息。根据用户提供的引用,特别是引用[4]和[5],得物的签名算法可能涉及逆向工程分析,使用了JavaScript中的XMLHttpRequest重写来拦截请求,并在请求中包含特定的sign参数。这可能意味着签名生成是在客户端进行的,通常在前端JavaScript代码中完成。 接下来,我应该考虑常见的签名生成方法。常见的Web应用签名算法通常使用HMAC、AES、RSA或自定义的哈希组合。引用[1]提到了RSA算法,但得物的签名可能更倾向于使用HMAC-SHA256之类的哈希算法,结合时间戳、随机数和请求参数进行签名,以防止篡改和重放攻击。 用户可能需要具体的步骤,比如逆向分析得物的JavaScript代码,找到生成sign的函数,提取关键参数和加密逻辑。引用[5]中的代码片段展示了如何重写XMLHttpRequest的open方法来拦截请求,这可能用于调试和定位签名生成的代码位置。 此外,引用[4]提到使用Python进行算法还原,所以可能需要在Python中复现JavaScript的签名生成逻辑。这通常涉及分析请求参数如何排序、拼接,以及如何与密钥结合进行哈希或加密。需要注意反爬机制,如obfuscation(代码混淆)或动态密钥,这可能需要使用AST(抽象语法树)解析或动态执行来还原算法。 用户可能还需要了解如何应对反调试措施,比如在Chrome开发者工具中使用断点调试,或者使用工具如Frida进行Hook。同时,引用[3]和[4]强调了法律和合规问题,确保研究仅用于学习目的,不用于非法用途。 最后,应该提醒用户注意法律风险,遵循网站的使用条款,避免侵犯知识产权或违反计算机安全法律。总结起来,实现得物签名需要逆向工程分析前端代码,提取关键算法,处理可能的混淆和反调试,最后用目标语言如Python复现算法。</think>### 得物签名算法实现方式分析 得物签名算法主要用于接口请求的身份验证和防篡改保护,常见实现方式涉及以下技术点: #### 1. **签名参数组成** 签名通常由以下参数动态生成: - 请求参数(经排序、过滤空值后拼接) - 时间戳(如:$timestamp=1620000000$) - 随机数(如:$nonce=5a8s3d$) - 设备指纹(如:$device\_id=abcdef$) - 应用密钥(加密盐值,可能动态获取)[^4] 示例参数拼接逻辑: $$ \text{sign\_str} = \text{path} + \text{sorted\_params} + \text{timestamp} + \text{nonce} $$ #### 2. **加密算法类型** 根据逆向分析,得物可能采用以下组合: - **HMAC-SHA256**:对拼接字符串进行哈希运算 - **AES/Base64编码**:对结果二次处理 - **自定义位移/异或操作**:增加逆向难度[^5] #### 3. **JavaScript代码混淆** 关键函数可能被混淆,例如: ```javascript function _0x12ab5(a, b) { return a ^ b << 3; } // 需要AST解析还原控制流 ``` #### 4. **Python算法还原示例** ```python import hmac import hashlib def generate_sign(params, secret_key): # 1. 参数排序并拼接 sorted_str = '&'.join([f"{k}={v}" for k,v in sorted(params.items())]) # 2. HMAC-SHA256加密 sign = hmac.new(secret_key.encode(), sorted_str.encode(), hashlib.sha256).hexdigest() # 3. 自定义处理(示例) return sign.upper() + str(int(time.time())) ``` #### 5. **反爬对抗措施** - 动态密钥:通过接口定期更新加密盐值 - 环境检测:验证是否在真机环境运行 - 请求频率限制:异常高频触发验证码[^5]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值