引例: 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#includeview code#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;
}
**2:矩陣^n+1,右上格之和-1。
#include#includeview code#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;
}
**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...