上次已经写过了矩阵快速幂,这次再写的原因是因为此题hdu5451用了很多的黑科技,因此还是值得记录的。
问题简述如下:
$$ y = (5+ 2\sqrt{6})^{1+2^x}$$
where $0 \leq x < 2^{32} $ and a prime number $p(p<46337)$,calculate $r = \floor{y} \;mod\; p$.
实际上我们需要计算的是
$$ r = (5+ 2\sqrt{6})^{1+2^x} + (5 - 2\sqrt{6})^{1+2^x} -1 $$
设 $a_n = (5+ 2\sqrt{6})^{1+2^x} + (5 - 2\sqrt{6})^{1+2^x} $ 则我们有
$$ a_0=2,a_1=10,a_n = a_{n-1} +a_{n-2}$$
最终答案即为
$$ (a_{1+2^n} - 1) \;mod\; M $$
另一方面,由递推关系式子,我们知道
$$ \left( \begin{matrix} a_{n} \\ a_{n-1} \end{matrix} \right) = A \left( \begin{matrix} a_{n-1} \\ a_{n-2} \end{matrix} \right) = A^{n-1} \left( \begin{matrix} a_1 \\ a_0 \end{matrix} \right) $$
因此
$$ \left( \begin{matrix} r \\ * \end{matrix} \right) = A^{2^x} \left( \begin{matrix} 10 \\ 2 \end{matrix} \right) $$
由于我们需要的是最终结果模 $p$.
而 $GL(n,p)$可看成 $n$ 阶方针到自身的可逆变换全体。推理易知道
$$ |GL(n,p)| = \prod_{i=0}^{n-1} (p^n-p^i) $$
对于此题中 $ mp = |GL(2,p)| = (p^2-1)(p^2-p) $,由群的Lagrange定理知 $A^{|GL(2,p)|}=I_2$。因此 当矩阵$A$可逆时,我们只需计算$A^{2^x \mod mp}$ 用快速幂解决即可,但是这里有一个问题就是 mp 有可能很大,导致快速幂乘法的时候会溢出,于是乘法用快速加法来实现,具体见代码
其实对于 $n=2$ 的情形,周期为 $p^2-1$。
1 | //#pragma comment(linker,"/STACK:10240000,10240000") |