模板 數學 矩陣快速冪

2022-05-07 22:54:17 字數 3749 閱讀 7204

線性遞推公式找遞推矩陣的方法:

構造方法:規定由遞推矩陣a,左乘由項構成的矩陣f,其中矩陣a的第一列為對應係數,左下角為單位矩陣,右下角為零矩陣。

對於遞推式的常數c,在矩陣f中增加最後一行c,在a的最右列增加兩個1(通常選右上角和左下角)。

對於遞推式的c的n次方,在矩陣f中增加最後一行c的n次方,在a的最右列增加兩個c(通常選右上角和左下角)。

以斐波那契數列為例,這裡使用了快速乘進一步防止溢位。

#includeusing

namespace

std;

#define ll long long

#define maxn 2ll mod=1000000007;//

快速乘 a*b%p 防止乘法溢位ll

ll qmut(ll a,ll b)

return

res;

}class

matrix

//對陣列的初始化

void

init(ll num[maxn][maxn]) }}

matrix

operator*(matrix &m1)

}return

t; }

matrix qpow(ll n)

return

t; }

void

show()

cout

<

}cout

<

}};int

main()

ll num[maxn][maxn];

matrix a;

memset(num,

0,sizeof

(num));

num[

0][1]=num[1][0]=num[1][1]=1

; a.init(num);

//初始化a矩陣

matrix ini;

memset(num,

0,sizeof

(num));

num[

0][0]=1

; num[

1][0]=1

; ini.init(num);

matrix an=a.qpow(n-2); //

求出矩陣的快速冪

matrix res=an*ini;

cout

<1][0]<

}

#includeusing

namespace

std;

#define ll long long

#define maxn 4ll mod=1000000007;//

快速乘 a*b%p 防止乘法溢位ll

ll qmut(ll a,ll b)

return

res;

}class

matrix

//對陣列的初始化

void

init(ll num[maxn][maxn]) }}

matrix

operator*(matrix &m1)

}return

t; }

matrix qpow(ll n)

return

t; }

void

show()

cout

<

}cout

<

}};int

main()

ll num[maxn][maxn];

matrix a;

memset(num,

0,sizeof

(num));

num[

0][1]=num[1][2]=num[2][3]=num[3][1]=num[3][3]=1

; a.init(num);

//初始化a矩陣

matrix ini;

memset(num,

0,sizeof

(num));

num[

0][0]=1

; num[

1][0]=1

; num[

2][0]=1

; num[

3][0]=2

; ini.init(num);

matrix an=a.qpow(n-4); //

求出矩陣的快速冪

matrix res=an*ini;

printf(

"%d\n

",res.m[3][0

]); }}}

帶n的次方的矩陣快速冪,找出相鄰兩項的關係就可以,用楊輝三角就可以了。

#includeusing

namespace

std;

#define ll long long

#define maxn 8ll mod=2147493647

;class

matrix

//對陣列的初始化

void

init(ll num[maxn][maxn]) }}

matrix

operator*(matrix &m1)

}return

t; }

matrix qpow(ll n)

return

t; }

void

show()

cout

<

}cout

<

}};int

main()

else

if(n==2

) else

}num[

6][7]=1

; num[

7][5]=3

; num[

7][6]=3

; num[

7][7]=2

; a.init(num);

//初始化a矩陣

matrix ini;

memset(num,

0,sizeof

(num));

num[

0][0]=1

; num[

1][0]=3

; num[

2][0]=9

; num[

3][0]=27

; num[

4][0]=81

; num[

5][0]=243

; num[

6][0]=a;

num[

7][0]=b;

ini.init(num);

matrix an=a.qpow(n-2); //

求出矩陣的快速冪

matrix res=an*ini;

printf("

%lld\n

",res.m[7][0

]); }}}

}

數學 快速冪與矩陣快速冪

二進位製取冪的想法是,我們將取冪的任務按照指數的 二進位制表示 來分割成更小的任務 快速冪的遞迴版本 long long fastpower long long a,long long b while迴圈版本 相對於原來的遞迴版本更快 解決你的tle long long fastpower long...

數學 快速冪與矩陣快速冪

1.a sequence of numbers 題目 題解 這是一道隱藏的快速冪的模板題,從資料我們就可以知道。對該題進行分析,如何判別是等差or等比,通過比較a 2 a 1 a 3 a 2 如果相等,則為等差 否則a 2 a 1 a 3 a 2 就為等比,然後利用快速冪來解決等比。includeu...

矩陣快速冪模板

剛學了矩陣快速冪,花了點時間把之前的 修改一下寫成了矩陣類,就當做模板了.話不多說下面貼 首先是標頭檔案和巨集定義什麼的 include include include using namespace std define inf 1000000000 define maxm 20 define m...