jun 碰到了挺多數列的題,線性遞推,值又很大,直接推會超時,所以去網上找題解的時候,找到了矩陣快速冪以及杜教板子,杜教板子還沒看懂,就以後再發
首先,快速冪,之前也學了整數的快速冪,複雜度是o(log^2n)這裡就把模版貼一下
int poww(int a,int然後對於矩陣快速冪,只需要在快速冪中將兩個整數a ,b改成矩陣形式就行了,然後相乘需要改成矩陣相乘b)
return
ans;
}
const然後對於矩陣快速冪的運用來說,一般上用於線性遞推的數列求第n項和int maxn=3
;const
int mod=1000000007
;struct
matrix
};matrix mul(matrix a,matrix b)}}
return
ans;
}matrix qpow(matrix a,
intn)
return
ans;
}
比如巨大的斐波拉契數列,如果直接用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...