矩陣 求A的1到N次冪之和

2022-04-30 14:33:10 字數 2918 閱讀 5647

引例: matrix power series

題目大意,給定矩陣a,求a^1+a^2+a^3+...a^n。

題解:已知x=a,可以通過以下矩陣求出ans=a^1+a^2+...a^n ans=矩陣^n後第一行之和-1=矩陣^(n+1)後右上格的和-1

。 同理:矩陣也可以,只需要把1改為單位矩陣元即可。

左圖a是常數,1就是1; 右圖a是矩陣,1是單位元矩陣(主對角線是1)。

**1:矩陣^n,第一行之和-1。

#include#include

#include

#include

#include

using

namespace

std;

const

int maxn=70

;int

n,k,mod;

struct

mat mat friend

operator *(mat a,mat b)

mat friend

operator ^(mat a,int

x)

return

res;

}};int

main()

for(int i=1;i<=n;i++) array.mp[i][i+n]=array.mp[i+n][i+n]=1

; array=array^(k);

for(int i=1;i<=n;i++) array.mp[i][i+n]-=1

;

for(int i=1;i<=n;i++)

return0;

}

view code

**2:矩陣^n+1,右上格之和-1。

#include#include

#include

#include

#include

using

namespace

std;

const

int maxn=70

;int

n,k,mod;

struct

mat mat friend

operator *(mat a,mat b)

mat friend

operator ^(mat a,int

x)

return

res;

}};int

main()

for(int i=1;i<=n;i++) array.mp[i][i+n]=array.mp[i+n][i+n]=1

; array=array^(k+1

);

for(int i=1;i<=n;i++) array.mp[i][i+n]-=1

;

for(int i=1;i<=n;i++)

return0;

}

view code

**3:利用二分。

--------------------分界線---------------------------

例題:hdu2243:考研路茫茫——單詞情結

題意:問長度位1到l的所有單詞中,有多少個不含給出的幾個單詞。
思路:利用矩陣得到可以26的1到n次冪。然後利用ac自動機得到基本矩陣x,再利用矩陣得到得到x^0+x^1+x^2...x^n。

比如得到26的0到n次冪和,就有矩陣a[

0][0]=26,a[0][1]=1,a[1][0]=0,a[1][1]=1;

矩陣^n後,第一行的和就是答案。

#include#include

#include

#include

#include

using

namespace

std;

#define ull unsigned long long

const

int maxn=40

;int ch[maxn][26

],cnt;

intq[maxn],head,tail,next[maxn],tag[maxn];

char s[20

];struct

mat mat init()

mat friend

operator *(mat a,mat b)

mat friend

operator ^(mat a,int

x)

return

res;

}};mat array;

struct

acautom

void

insert()

tag[now]=1

; }

void

build()

while(tail

else ch[u][i]=ch[next[u]][i];

if(!tag[ch[u][i]]) array.mp[u][ch[u][i]]++;}}

cnt++;

for(int i=0;i<=cnt;i++) array.mp[i][cnt]=1

; }

void qpow(int

k)

}trie;

intmain()

trie.build();

trie.qpow(k);

}return0;

}

求x的N次冪

典型的減小時間複雜度的做法是記住程式已經做的事情,避免在做重複的事情,比如使用n 1個迴圈乘法就是一直在做重複的乘x。通過記住x,x2,x4,等資料,可以大大減小時間的複雜度。程式如下 包含標頭檔案 include include using namespace std double pow int...

矩陣快速二分求n次冪

遞推數列 同理fibonacci數列也可以使用矩陣來求,二分求矩陣的n次冪可以達到o n lgn 的時間複雜度。2 n k的問題也可以使用這個二分的方法來求解。include includeusing namespace std struct matrix matrix e void inite i...

矩陣快速二分求n次冪

遞推數列 同理fibonacci數列也可以使用矩陣來求,二分求矩陣的n次冪可以達到o n lgn 的時間複雜度。2 n k的問題也可以使用這個二分的方法來求解。include includeusing namespace std struct matrix matrix e void inite i...