BM 模板

一种用来求最短线性递推的奇妙算法。复杂度是 $O(n^2)$ 。

忘了怎么做建议看看这个博客,很清楚了。

模板题 CF848E

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int Pow( int x , int a ) {
int ans = 1 , cur = x % P;
while( a ) {
if( a & 1 ) ans = 1ll * ans * cur % P;
cur = 1ll * cur * cur % P , a >>= 1;
}
return ans;
}

int del[MAXN];
vi BM( vi a ) {
vi re , las;
int fail = -1 , n = a.size();
for( int i = 0 ; i < n ; ++ i ) {
del[i] = a[i];
for( int j = 0 ; j < re.size() ; ++ j ) del[i] = ( del[i] + P - a[i - j - 1] * 1ll * re[j] % P ) % P;
if( !del[i] ) continue;
if( fail == -1 ) { fail = i , re.resize( i + 1 ); continue; }
int mu = del[i] * 1ll * Pow( del[fail] , P - 2 ) % P;
vi tmp = re; re.clear() , re.resize( i - fail - 1 ) , re.pb( mu );
for( int x : las ) re.pb( x * 1ll * ( P - mu ) % P );
fail = i , las = tmp;
if( re.size() < las.size() ) re.resize( tmp.size() );
for( int i = 0 ; i < tmp.size() ; ++ i ) re[i] = ( re[i] + tmp[i] ) % P;
}
return re;
}
文章作者: yijan
文章链接: https://yijan.co/bm-mo-ban/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Yijan's Blog