矩阵快速幂

就是一些转移式,用矩阵快速幂优化一下。

https://vjudge.net/contest/510197#overview

首先,定义矩阵乘法:

对于一个 n×k 的矩阵 A 和一个 k×m 的矩阵 B 还有一个矩阵 C=A×B。那么 C 是一个 n×m 的矩阵,且 Cij=p=1kAi,p×Bp,j(i=1,2,,n,j=1,2,,m)

然后,因为矩阵乘法满足结合律,所以我们有了矩阵快速幂。矩阵快速幂的话就是把快速幂的板子套在矩阵上而已。

A

已知 f1=x,f2=y,fi=fi1+fi2(i>2),求 fn

  • n=1fn=x
  • n=2fn=y
  • n>2

我们可以尝试推一下转移矩阵 base

(fi1+fi2fi1)=(1110)(fi1fi2)

然后快速幂就好了。

B

b 个格子,每个格子有 n 个数字,各个格子里面的数字都是相同的. 求从 b 个格子中各取一个数字, 构成一个 b 位数, 使得这个 b 位数模 xk 的方案数(同一格子内相同的数字算不同方案)。

我们设 dpi,j 表示前 i 个格子中取数后,模 x 的结果为 j 的方案数。

递推式也容易推出来:dpi,(j×10+ak)modx=dpi1,j

但是,这样显然会 TLE。所以我们需要一些优化。

对于每一个 i=1,2,,b,我们可以把 dpi,j,j=0,1,,x1 当做一个状态。然后根据所给的 a 进行转移。然后用矩阵快速幂优化即可。

C

你在 (0,0)

(x,y) 时,每次移动可以到达 (x+1,y+1),(x+1,y),(x+1,y1)

平面上有 n 条线段,平行于 x 轴,参数为ai , bi ,ci ,表示在 (ai,ci)(bi,ci) 的一条线段,保证 bi=ai+1

要求你一直在线段的下方且在 x 轴上方,即 aixbi 时, 0yci

: 到达 (k,0) 的方案数,方案数对 109+7 取模。

我们设 dpi,j 表示走到 (i,j) 的方案数,ki 表示 x 坐标为 i 时行动的上界。

按照题意,递推式:

dpi,j={dpi1,j1+dpi1,j(j=ki)dpi1,j1+dpi1,j+dpi1,j+1(0<j<ki)dpi1,j+dpi1,j+1(j=0)

那么,我们可以构造一个形如 (110000111000000111000011) 的矩阵进行转移。用快速幂优化即可。

D

fi=1(i<m)

fi=fi1+fim(mi)

fn

用一个 m×m 的矩阵就可以了。

(fi+1+fim+1fifi1fim+1)=(100001100000010000000010)(fifi1fi2fim)

E

已知 f1,f2,f3cfi=c2i6fi1fi2fi3(i>3),求 fn

我们可以发现这里不再是加,所以不能直接矩阵快速幂。但是,我们都知道对于一个大于 1 的数 alogaxy=logax+logay,但是,如果用 log 的话,你的精度爆上个十几遍是不成问题的。所以我们需要在推一推。

f1=c0f30f20f1

f2=c0f30f2f10

f3=c0f3f20f10

f4=c2f3f2f1

f5=c6f32f22f1

f6=c14f34f23f12

f7=c30f37f26f14

f8=c60f313f211f17

我们设 ti,j,(i>3,j=1,2,3) 表示 fi 分解过后 fj 的系数,gi 表示 fic 的系数。我们发现:

ti,j=ti1,j+ti2,j+ti3,j

gi=2i6+gi1+gi2+gi3

然后就可以用矩阵快速幂推过去了,但是,如果不取模的话,会炸掉,所以我们需要欧拉降幂:

ababmodφ(p)(modp)

因为本题的模数是给质数,所以对指数的模数为其减一。

posted @   Grisses  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
Document
点击右上角即可分享
微信分享提示