矩陣快速冪的總結以及模版

2022-05-16 15:36:10 字數 1616 閱讀 4807

jun 碰到了挺多數列的題,線性遞推,值又很大,直接推會超時,所以去網上找題解的時候,找到了矩陣快速冪以及杜教板子,杜教板子還沒看懂,就以後再發

首先,快速冪,之前也學了整數的快速冪,複雜度是o(log^2n)這裡就把模版貼一下

int poww(int a,int

b)

return

ans;

}

然後對於矩陣快速冪,只需要在快速冪中將兩個整數a ,b改成矩陣形式就行了,然後相乘需要改成矩陣相乘

const

int maxn=3

;const

int mod=1000000007

;struct

matrix

};matrix mul(matrix a,matrix b)}}

return

ans;

}matrix qpow(matrix a,

intn)

return

ans;

}

然後對於矩陣快速冪的運用來說,一般上用於線性遞推的數列求第n項和

比如巨大的斐波拉契數列,如果直接用f(n)=f(n-1)+f(n-2)的話會超時,而如果用矩陣快速冪的形式去算的的話複雜度會降很多

即矩陣形式就是

。然後只需要對前面的那個矩陣求(n-1)次方就行了

還有的題目是需要自己去推的矩陣形式

列出最近寫的兩個題

一道是hdu的6185

一道是牛客網小白賽6的洋灰三角

第二題是需要求前n項和的但是解法還是相似的,遞推式就是sum(n)=sum(n-1)+f(n)

就把第二題的**附一下吧

#include #include 

#include

#include

#include

#include

#include

#include

#define inf 1e9

using

namespace

std;

const

int maxn=3

;const

int mod=1000000007

;struct

matrix

};matrix mul(matrix a,matrix b)}}

return

ans;

}matrix qpow(matrix a,

intn)

return

ans;

}int

main()

ans.a[

0][0]=1;ans.a[0][1]=1;ans.a[1][1]=k;

ans.a[

1][2]=1;ans.a[2][2]=1

; res=qpow(ans,n);

long

long s=res.a[0][0]*1l%mod+res.a[0][1]*1l%mod+res.a[0][2]*q%mod;

cout

<1

<

}

模版 快速冪 矩陣快速冪

原理 x yx y xy中的 y yy 轉化成二進位制數,然後每乙個 1 11 對應 x xx 的 i ii 次方 這樣把x yx y xy轉化成了x yx y xy x ax a xa x bx b xb x cx c xc 通過對 x xx 不斷翻倍的過程,來匹配y轉成二進位制的 111。如果為...

模版 矩陣快速冪

矩陣快速冪就是快速冪的矩陣用法 ll fast power ll fp a ll fp n ll fp p return ret 得到遞推公式後推出轉移矩陣然後就套模版啦 include include define mod 1000000009 define ll long long using ...

矩陣快速冪模版

const int n 10 int tmp n n void multi int a n int b n int n 上訴res陣列就等同於普通快速冪初始化的1,原理想通的,這個矩陣叫單位矩陣e,性質就是e a a,就是1 a a,一樣,單位矩陣就是對角線全是1其他全是0 最終算出的結果是乙個re...