其实不是理解很透彻,,,先写上
简而言之:
是一个知道递推式,快速求第n项的方法
k比较小的时候可以用矩阵乘法
k是2000,n是1e18呢?
思想:求出开始的k项的每一项对第n项的贡献
特征多项式,,
fibonacci:
f[n]=f[n-1]+f[n-2]
x^2=x+1
推广:
f[n]=af[n-1]+bf[n-2]
x^2=ax+b*1
再推广:
f[n]=a1f[n-1]+a2f[n-2]+...+akf[n-k]
x^k=a1x^(k-1)+...+ak
特征多项式就是左边移动过去:x^2-x-1=0
其实本质是:
x是转移矩阵。
必然有x^2-x-1=0成立
具体的证明以及用法
$B*A^n=F_n$
$B*A^{n-1}=F_{n-1}$
...
$B*A^{n-k}=F_{n-k}$
如果有:$F_n=\sum_{i=1}^k ai*F_{n-i}$
那么可以把第一个式子减去后面k个等式的乘上$a_i$的和得到:
$B*(A^n-a_{1}A^{n-1}-.....-a_{k}A^{n-k})=0$
必然有:$(A^n-a_{1}A^{n-1}-.....-a_{k}A^{n-k})=0$
不妨用x来代替A
$x^{k}-\sum_{i=0}^{k-1} a_0*x^{k-1-i}=0$
对于$x^n$,一定可以写成:$x^n=(x^{k}-\sum_{i=0}^{k-1} a_0*x^{k-1-i})*g(x)+r(x)$
可以得到:
$A^n=r(A)$
设$r(A)=\sum_{i=0}^{k-2} bi*A^{k-2-i}$
同时乘上初始矩阵$B$
$B*A^n=\sum_{i=0}^{k-2} bi*B*A^{k-2-i}$
关注后面的:$B*A^{k-2-i}$
两种处理方法:
$B*A^{k-2-i}$的最大下标的元素就是$F_{2*k-2-i}$,
我们需要提前推出$F_k \to F_{2*k-2}$然后每一个依次乘上对应的系数$b_i$即可(n要提前-=k)
或者,$B*A^{k-2-i}$的最小下标的元素就是$F_{k-2-i}$,然后每一个依次乘上对应的系数$b_i$即可(n就不用动了)
至于$r(x)$的求法
1.暴力多项式除法(n太大和暴力没有区别)
2.倍增+暴力多项式取mod
计算$x=T \space mod \space A$自乘得到:$x^2=T^2 \space mod \space A$,再暴力取模(由于A的首项是1,所以不用逆元O(k^2)即可)
类似快速幂一样乘到答案多项式里去
O(k^2logn)
3.暴力取模变成多项式除法O(klognlogk)
例题:
【BZOJ4161】