题目
给定两个正整数$n,m$,表示问题为$a+\frac{1}{a}=n,ask~~ a^m+\frac{1}{a^m}=?$
思路
- 这题一看就是数学题啊!而且好像不难,我想练练!
抱着这样的心情,我运用了$(x^n+y^n)=(x+y)(x^{n-1}-x^{n-2}*y+…)$这个公式,想要递归求出每一项,结果完美的全WA了。。
翻了翻题解,发现标答是用了递推的思想:
$$(a+\frac{1}{a})(a^{n-1}+\frac{1}{a^{n-1}})=(a^n+\frac{1}{a^n})+(a^{n-2}+\frac{1}{a^{n-2}})$$
这样就搞出了$f[x]$与$f[x-1],f[x-2]$的关系,如果直接滚动数组递推的话可得$40~point$。
- 如果想进一步优化就得用到计算机知识了。
抱着这样的想法,我把题解往下翻了翻,发现还有一个公式:
$(a^n+\frac{1}{a^n})^2=a^{2n}+\frac{1}{a^{2n}}+2$ ,
$(a^n+\frac{1}{a^n})(a^{n+1}+\frac{1}{a^{n+1}})=a^{2n+1}+\frac{1}{a^{2n+1}}+(a+\frac{1}{a})$
所以本质上应该是一个倍增的过程,代码十行都不到,估计这就是数学的魅力吧。
但是这种公式只是适用于此类式子,并不具有通用性。
既然得到了递推式,我们便可以利用矩阵加速达到同样的目的;
我们设$(a+\frac{1}{a})=k$,便可得到:
$$f[n]+f[n-2]=k*f[n-1]$$
容易构造以下递推式:
$\begin{bmatrix}0&1&0\\0&0&1\\0&{-1}&k\\\end{bmatrix}*\begin{bmatrix}F_{n-2}\\F_{n-1}\\F_n\\\end{bmatrix}=\begin{bmatrix}F_{n-1}\\F_n\\k*F_n-F_{n-1}\end{bmatrix}$
搞个矩阵加速玩玩即可,但是被细节坑的很惨:
可以注意到构造矩阵中有负数,若取模时候不进行处理可能会爆负,直接在转移时多加一个mo即可。
这玩意构造基本矩阵时候居然会爆LL!还要搞一个慢速乘处理一下。
此外就没了,上丑陋的代码:
1 | //1. n=2^k ---> f[k] get |