NOI2013 D1T1矩阵游戏
作者:互联网
NOI2013 D1T1矩阵游戏 题解
题意
给定a,b,c,d和一个N\(\times\)M的矩阵,其中\(f[1][1]=1,f[i][j]=af[i][j-1]+b\)
除了第一行以外,\(f[i][1]=c\times f[i-1][m]+d\)
求\(f[n][m]\)的值 a,b,c,d<\(10^9\) n,m<\(10^{1000000}\)
思路
不太熟悉矩阵乘法,但看到一递推式,我死去的关于数列的记忆就开始攻击我,所以可以考虑通过推式子来做这道题
具体实现
引入
首先回忆汉诺塔问题中\(a_{n}=2\times a_{n-1}+1\),通过在等式两边各加\(1\),我们可以得到\(\frac{a_{n}+1}{a_{n-1}+1}=2\)
从而构造出了公比为\(2\)的等比数列{\(\frac{a_{n}+1}{a_{n-1}+1}\)},首项\(a_{1}+1=2\)
再简单的化简一下就可以得到\(a_{n}=2^n-1\)
那么如何推广到这道题上面来呢?
解决办法
第一步
我们考虑递推式为\(f_{m}=a\times f_{m-1}+b\)的一个数列如何推导通项公式:
利用待定系数设原式为\(f_{m}+\lambda=a\times(f_{m-1}+\lambda)\),再拆开得到\(f_{m}=a\times f_{m-1}+\lambda\times(a-1)\)
对比上下两个式子不难得到$$b=\lambda\times (a-1)\iff\lambda=\frac{b}{a-1}$$
同时我们注意到\(a=1\)的时候是没有意义的,所以还要单独讨论。
然后就能得出\(f_{m}=(f_{1}+\lambda)\times a^{m-1}-\lambda\)辣
第二步
考虑行与行之间的关系\(f[i][1]=c\times f[i-1][m]\),其中\(f[i-1][m]\)我们已经解出,那么带入可得
\[f[i][1]=c\times [a^{m-1}\times(f[i-1][1]+\lambda)-\lambda]+d \]看到这种形式熟悉吗,没错,只不过是第一步中推导多了一大坨一点点而已,那么我们如法炮制最终可以得到
聪明的你可能已经发现了,\(a=1\)的时候\(c\)是不能为\(1\)的这也是一种需要讨论的情况
这时候要得到\(f[n][m]\)我们只需要再借用一次第一步中的公式,\(令TmpAns=f[n][1]\)
那么\(f[n][m]=(TmpAns+\lambda)\times a^{m-1}-\lambda\)
\(\longrightarrow f[n][m]=f[1][1]\times a^{n(m-1)}+a^{n(m-1)}c^{n-1}\theta+a^{m-1}(\lambda-\theta)-\lambda\)
收尾
讨论\(a\)、\(c\)各自的取值范围
关于数据范围
\(n\)、\(m\)的范围大到连__int128也无能为力了,怎么办呢?快去西天请欧拉佛祖
这时候就要用到拓展欧拉定理一边读入一边取模了
小细节
涉及到的除法都要使用逆元,用费马小和拓展欧几里得算都行
第一次用LaTeX,写了两个多小时,看来是太菜了
标签:frac,得到,矩阵,times,NOI2013,theta,D1T1,lambda 来源: https://www.cnblogs.com/Hanggoash/p/16692408.html