矩阵快速幂题目小结

1、HDU - 4686 (https://vjudge.net/problem/HDU-4686)

题意:

已知 a 0 = A 0 , a i = a i − 1 ∗ A X + A Y , b 0 = B 0 , b i = b i − 1 ∗ B X + B Y a_0 = A0, a_i = a_{i-1} * AX + AY, b_0 = B0, b_i = b_{i - 1} * BX + BY a0=A0,ai=ai1AX+AY,b0=B0,bi=bi1BX+BY,给定 n , A 0 , A X , A Y , B 0 , B X , B Y n, A0, AX, AY, B0, BX, BY n,A0,AX,AY,B0,BX,BY,求 ∑ i = 0 n − 1 a i b i \sum\limits_{i = 0}^{n - 1}a_ib_i i=0n1aibi ( n ≤ 1 0 18 ) (n \leq 10^{18}) (n1018)

解题思路:

c i = a i b i ,   S n − 1 = ∑ i = 0 n − 1 c i c_i = a_ib_i,~S_{n - 1} = \sum\limits_{i = 0}^{n - 1}c_i ci=aibi, Sn1=i=0n1ci,易得递推关系
c i = A X ∗ B X ∗ c i − 1 + A X ∗ B Y ∗ a i − 1 + A Y ∗ B X ∗ b i − 1 + A Y ∗ B Y   S i − 1 = S i − 2 + c i − 1   设   M i − 1 = A M i − 2 ,   M − 1 = ( 0 , A 0 ∗ B 0 , A 0 , B 0 , 1 ) T   M i − 1 = ( S i − 1 , c i , a i , b i , 1 ) T   M i − 2 = ( S i − 2 , c i − 1 , a i − 1 , b i − 1 , 1 ) T c_i = AX * BX * c_{i - 1} + AX * BY * a_{i - 1} + AY * BX * b_{i - 1} + AY * BY \\ ~ \\ S_{i - 1} = S_{i - 2} + c_{i - 1} \\ ~ \\ 设~M_{i - 1} = AM_{i - 2},~M_{-1} = (0, A0 * B0, A0, B0, 1)^T \\ ~ \\ M_{i - 1} = (S_{i - 1}, c_{i}, a_{i}, b_{i}, 1)^T \\ ~ \\ M_{i - 2} = (S_{i - 2}, c_{i - 1}, a_{i - 1}, b_{i - 1}, 1)^T ci=AXBXci1+AXBYai1+AYBXbi1+AYBY Si1=Si2+ci1  Mi1=AMi2, M1=(0,A0B0,A0,B0,1)T Mi1=(Si1,ci,ai,bi,1)T Mi2=(Si2,ci1,ai1,bi1,1)T
不难写出转移矩阵 A A A,则 M n − 1 = A n M − 1 M_{n - 1} = A^nM_{-1} Mn1=AnM1矩阵快速幂即可。
 
2、HDU - 5667 (https://vjudge.net/problem/HDU-5667)

题意:

f n = { 1 n = 1 a b n = 2 a b f n − 1 c f n − 2 o t h e r w i s e f_n = \begin{cases} 1 & n = 1 \\ a^b & n = 2 \\ a^bf_{n - 1}^cf_{n - 2} & otherwise \end{cases} fn=1ababfn1cfn2n=1n=2otherwise
给定 n , a , b , c , p n, a, b, c, p n,a,b,c,p,求 f n   m o d   p f_n~mod~p fn mod p ( n ≤ 1 0 18 ) (n \leq 10^{18}) (n1018)

解题思路:

取对数,
g n = l o g a f n = { 0 n = 1 b n = 2 b + c g n − 1 + g n − 2 o t h e r w i s e   f n = a g n g_n = log_af_n = \begin{cases} 0 & n = 1 \\ b & n = 2 \\ b + cg_{n - 1} + g_{n - 2} & otherwise \end{cases} \\ ~ \\ f_n = a^{g_n} gn=logafn=0bb+cgn1+gn2n=1n=2otherwise fn=agn
矩阵快速幂求出 g n g_n gn,再快速幂求出 f n f_n fn
 
3、HDU - 5451 (https://vjudge.net/problem/HDU-5451)

题意:

给定 x , M x, M x,M,求 ⌊ ( 5 + 2 6 ) 1 + 2 x ⌋   m o d   M \lfloor(5 + 2\sqrt{6})^{1 + 2^x}\rfloor~mod~M (5+26 )1+2x mod M ( x < 2 32 , M ≤ 46337   且 是 素 数 ) (x \lt 2^{32}, M \leq 46337~且是素数) (x<232,M46337 )

解题思路:

先考虑 f ( n ) = ⌊ ( 5 + 2 6 ) n ⌋ f(n) = \lfloor(5 + 2\sqrt{6})^n\rfloor f(n)=(5+26 )n,这像是二阶线性递推式的通项的一部分,考虑下式
g ( n ) = a g ( n − 1 ) + b g ( n − 2 )   特 征 方 程   r 2 − a r − b = 0 Δ = a 2 + 4 b   特 征 根   r = a ± a 2 + 4 b 2   若 r 1 ≠ r 2 , g ( n ) = c 1 r 1 n + c 2 r 2 n   构 造   g ( n ) = ( 5 + 2 6 ) n + ( 5 − 2 6 ) n   得   a = 10 ,   b = − 1 ,   即 g ( n ) = 10 g ( n − 1 ) − g ( n − 2 )   而   0 < ( 5 − 2 6 ) n ≤ 1 ,   故   f ( n ) = g ( n ) − 1 g(n) = ag(n - 1) + bg(n - 2) \\ ~ \\ 特征方程 ~ r^2 - ar - b = 0 \quad \Delta = \sqrt{a^2 + 4b}\\ ~ \\ 特征根 ~ r = \cfrac{a \pm \sqrt{a^2 + 4b}}{2} \\ ~ \\ 若 r_1 \neq r_2,g(n) = c_1r_1^n + c_2r_2^n \\ ~ \\ 构造 ~ g(n) = (5 + 2\sqrt{6})^n + (5 - 2\sqrt{6})^n \\ ~ \\ 得 ~ a = 10,~b = -1,~即g(n) = 10g(n - 1) - g(n - 2)\\ ~ \\ 而 ~ 0 \lt (5 - 2\sqrt{6})^n \leq 1, ~故 ~ f(n) = g(n) - 1 g(n)=ag(n1)+bg(n2)  r2arb=0Δ=a2+4b   r=2a±a2+4b  r1=r2g(n)=c1r1n+c2r2n  g(n)=(5+26 )n+(526 )n  a=10, b=1, g(n)=10g(n1)g(n2)  0<(526 )n1,  f(n)=g(n)1
考虑矩阵快速幂求解 g ( 1 + 2 x ) g(1 + 2^x) g(1+2x),由于 1 + 2 x 1 + 2^x 1+2x 太大,需要进一步寻找循环节优化,由于 M M M 不大,暴力求循环节可行,通用方法见下题。
 
4、HDU - 5674 (https://vjudge.net/problem/HDU-5674)

题意:

给定 a , b , x , y a, b, x, y a,b,x,y,求 f ( x y ) f(x^y) f(xy),其中 f ( n ) = ( a + b ) n + ( a − b ) n   m o d   1 0 9 + 7 f(n) = (a + \sqrt{b})^n + (a - \sqrt{b})^n~mod~10^9+7 f(n)=(a+b )n+(ab )n mod 109+7 ( x ≤ 50 , y ≤ 1 0 18 ) (x \leq 50, y \leq 10^{18}) (x50,y1018)

解题思路:

由上一题特征根法得到通项
g ( n ) = c g ( n − 1 ) + d g ( n − 2 ) ,   c = 2 a ,   d = b − a 2 g(n) = cg(n - 1) + dg(n - 2), ~c = 2a,~d = b - a^2 g(n)=cg(n1)+dg(n2), c=2a, d=ba2
依旧需要求循环节来优化,记 p e r per per 为一个周期,对于上述二阶常系数线性递推式 ( c   m o d   p ≠ 0 ,   d   m o d   p ≠ 0 ) (c~mod~p\neq 0,~d~mod~p\neq 0) (c mod p=0, d mod p=0),这里不加证明给出:
p e r = { p − 1 ( Δ p ) = 1 ( p + 1 ) ( p − 1 ) ( Δ p ) = − 1 ( p   为 奇 素 数 ) p ( p − 1 ) ( Δ p ) = 0   其 中 ,   ( Δ p )   为 勒 让 德 符 号 ,   若   p = 2 ,   有   p e r = 3   统 一 化 有   p e r = p 2 − 1   ( p   为 素 数 )   若   c   m o d   p = 0   或   d   m o d   p = 0 ,   数 列 很 容 易 得 到 , 不 再 讨 论 per = \begin{cases} p - 1 & (\cfrac{\Delta}{p}) = 1 \\ (p + 1)(p - 1) & (\cfrac{\Delta}{p}) = -1 & (p~为奇素数) \\ p(p - 1) & (\cfrac{\Delta}{p}) = 0 \end{cases} \\ ~ \\ 其中,~(\cfrac{\Delta}{p}) ~ 为勒让德符号,~若 ~ p = 2,~有 ~ per = 3 \\ ~ \\ 统一化有 ~ per = p^2 - 1~ (p~为素数) \\ ~ \\ 若 ~ c~mod~p = 0~或~d~mod~p = 0,~数列很容易得到,不再讨论 per=p1(p+1)(p1)p(p1)(pΔ)=1(pΔ)=1(pΔ)=0(p ) , (pΔ) ,  p=2,  per=3  per=p21 (p )  c mod p=0  d mod p=0, 
 
5、CodeForces - 719E (https://vjudge.net/problem/CodeForces-719E)

题意:

给定一个长度为 n n n 的数组 a a a,再有 m m m 次操作,每次操作为:① 1 , l , r , x 1, l, r, x 1,l,r,x,将 a l , a l + 1 , . . . , a r a_l, a_{l + 1}, ... ,a_r al,al+1,...,ar 加上 x x x,② 2 , l , r 2, l, r 2,l,r,询问 ∑ i = l r f ( a i ) \sum\limits_{i = l}^{r}f(a_i) i=lrf(ai),其中 f ( n ) f(n) f(n) 为斐波那契数列。 ( n , m ≤ 1 0 5 ) (n, m \leq 10^5) (n,m105)

解题思路:

考虑用矩阵来得到斐波那契数列的值,令 M i = A M i − 1 M_i = AM_{i - 1} Mi=AMi1

其中 M i = [ f ( i + 1 ) f ( i ) ] ,   A = [ 1 1 1 0 ] , M 0 = [   1   0 ] ,   M n = A n M 0 M_i = \left[\begin{matrix} f(i + 1) \\ f(i) \end{matrix}\right],~A = \left[\begin{matrix} 1 & 1 \\ 1 & 0\end{matrix}\right], M_0 = \left[\begin{matrix} ~1~ \\ 0 \end{matrix}\right],~M_n = A^nM_0 Mi=[f(i+1)f(i)], A=[1110],M0=[ 1 0], Mn=AnM0

先看求和, ∑ i = l r M a i = ∑ i = l r A a i M 0 = ( ∑ i = l r A a i ) M 0 \sum\limits_{i = l}^{r} M_{a_i} = \sum\limits_{i = l}^{r} A^{a_i}M_0 = (\sum\limits_{i = l}^{r}A^{a_i})M_0 i=lrMai=i=lrAaiM0=(i=lrAai)M0

再看更新, ∑ i = l r M a i + x = ( ∑ i = l r A a i + x ) M 0 = ( ∑ i = l r A a i ) A x M 0 \sum\limits_{i = l}^{r} M_{a_i + x} = (\sum\limits_{i = l}^{r} A^{a_i + x})M_0 = (\sum\limits_{i = l}^{r}A^{a_i})A^xM_0 i=lrMai+x=(i=lrAai+x)M0=(i=lrAai)AxM0

线段树维护 ∑ i = l r A a i \sum\limits_{i = l}^{r} A^{a_i} i=lrAai,更新操作为区间乘矩阵 A x A^x Ax

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值