NOI2013 矩阵游戏

NOI2013 D1T1矩阵游戏 题解

题意

给定a,b,c,d和一个N×M的矩阵,其中f[1][1]=1,f[i][j]=af[i][j1]+b
除了第一行以外,f[i][1]=c×f[i1][m]+d
f[n][m]的值 a,b,c,d<109 n,m<101000000

思路

不太熟悉矩阵乘法,但看到一递推式,我死去的关于数列的记忆就开始攻击我,所以可以考虑通过推式子来做这道题

具体实现

引入

首先回忆汉诺塔问题中an=2×an1+1,通过在等式两边各加1,我们可以得到an+1an1+1=2
从而构造出了公比为2的等比数列{an+1an1+1},首项a1+1=2
再简单的化简一下就可以得到an=2n1
那么如何推广到这道题上面来呢?

解决办法

第一步

我们考虑递推式为fm=a×fm1+b的一个数列如何推导通项公式:
利用待定系数设原式为fm+λ=a×(fm1+λ),再拆开得到fm=a×fm1+λ×(a1)
对比上下两个式子不难得到b=λ×(a1)λ=ba1
同时我们注意到a=1的时候是没有意义的,所以还要单独讨论。
然后就能得出fm=(f1+λ)×am1λ

第二步

考虑行与行之间的关系f[i][1]=c×f[i1][m],其中f[i1][m]我们已经解出,那么带入可得

f[i][1]=c×[am1×(f[i1][1]+λ)λ]+d

看到这种形式熟悉吗,没错,只不过是第一步中推导多了一大坨一点点而已,那么我们如法炮制最终可以得到

f[n][1]=(c×am1)n1×f[1][1]+(c×am1)n1×αθ

θ=c×am1×λc×λ+dc×am11

聪明的你可能已经发现了,a=1的时候c是不能为1的这也是一种需要讨论的情况
这时候要得到f[n][m]我们只需要再借用一次第一步中的公式,TmpAns=f[n][1]
那么f[n][m]=(TmpAns+λ)×am1λ
f[n][m]=f[1][1]×an(m1)+an(m1)cn1θ+am1(λθ)λ

收尾

讨论ac各自的取值范围
关于数据范围

nm的范围大到连__int128也无能为力了,怎么办呢?快去西天请欧拉佛祖
这时候就要用到拓展欧拉定理一边读入一边取模了

ananmodϕ(p)(modp)

小细节

涉及到的除法都要使用逆元,用费马小和拓展欧几里得算都行

第一次用LaTeX,写了两个多小时,看来是太菜了

posted @   Hanggoash  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
动态线条
动态线条end
点击右上角即可分享
微信分享提示