洛谷P4723 模板 線性遞推(多項式取模)

2021-09-26 00:00:43 字數 3590 閱讀 2031

傳送門

考慮說要求乙個

a n=

∑i=1

kan−

if

ia_n=\sum_^a_f_i

an​=∑i

=1k​

an−i

​fi​

寫成矩陣的形式就是

a n=

an−1

f=a0

fn

a_n=a_f=a_0f^n

an​=an

−1​f

=a0​

fn實際上f

nf^n

fn最後就是乙個長度為k

kk的向量

滿足a n=

∑i=1

kcia

ia_n=\sum_^c_ia_i

an​=∑i

=1k​

ci​a

i​這樣的形式

由c ay

ley−

hami

lton

cayley-hamilton

cayley

−ham

ilto

n定理可以得到f

ff的特徵多項式

g (λ

)=de

t(λi

−f)=

λk−f

1λk−

1−f2

λk−2

……−f

k=

0g(λ)=det(λi-f)=λ^k-f_λ^-f_λ^……-f_k=0

g(λ)=d

et(λ

i−f)

=λk−

f1​λ

k−1−

f2​λ

k−2…

…−fk

​=0

而且g

gg最高次只有k−1

k-1k−

1次所以我們可以倍增多項式取模o(k

logk

logn

)o(klog_klog_n)

o(klog

k​lo

gn​)

求出f n%

gf^n\% g

fn%g

由於g (λ

)=

0g(λ)=0

g(λ)=0

,所以fn%

g=fn

f^n\% g=f^n

fn%g=f

n然後就完了

注意讀入的數最小有−1e

9-1e9

−1e9

#include

using

namespace std;

#define gc getchar

inline

intread()

#define re register

#define pb push_back

#define cs const

#define pii pair

#define fi first

#define se second

#define ll long long

#define poly vector

#define bg begin

#define int long long

cs int mod=

998244353

,g=3

;inline

intadd

(int a,

int b)

inline

void

add(

int&a,

int b)

inline

intdec

(int a,

int b)

inline

void

dec(

int&a,

int b)

inline

intmul

(int a,

int b)

inline

void

mul(

int&a,

int b)

inline

intksm

(int a,

int b,

int res=1)

inline

void

chemx

(ll &a,ll b)

inline

void

chemn

(int

&a,int b)

cs int n=

128005

,c=19

;poly w[c+1]

;inline

void

init_w()

int rev[n<<2]

;inline

void

init_rev

(int lim)

inline

void

ntt(poly &f,

int lim,

int kd)

inline poly operator

+(poly a,poly b)

inline poly operator

-(poly a,poly b)

inline poly operator

*(poly a,

int b)

inline poly operator

/(poly a,

int b)

inline poly operator

*(poly a,poly b)

while

(liminit_rev

(lim)

; a.

resize

(lim)

,ntt

(a,lim,1)

; b.

resize

(lim)

,ntt

(b,lim,1)

;for

(int i=

0;i)mul

(a[i]

,b[i]);

ntt(a,lim,-1

),a.

resize

(deg)

;return a;

}inline poly inv

(poly a,

int deg)

b.resize

(deg)

;return b;

}inline poly operator

/(poly a,poly b)

inline poly operator

%(poly a,poly b)

int n,m,a[n]

;poly f,g;

signed

main()

int anc=0;

for(

int i=

0;isize()

;i++

)add

(anc,

mul(res[i]

,a[i]))

; cout<}

洛谷P4723 模板 線性遞推

題目大意 求乙個滿足 k 階齊次線性遞推數列 a i 的第 n 項。即 a n sum limits f i times a 題解 線性齊次遞推,先見洛谷題解,下回再補 卡點 陣列大小計算錯誤,求逆中途計算時忘記加 mod 等 c code 這份全部是板子,可以用來測試,但是常數巨大 include...

洛谷 P3811 模板 乘法逆元 線性遞推逆元

給出n,p,求1 n所有數模p意義下的逆元.無論是擴充套件歐幾里得還是費馬小定理都是o n log 的,會t,這題因為是求1 n的所有數的逆元,因而可以遞推,若要求inv i 則可以設k p i,b p i.那麼k i b p 則k i b與0同餘.所以k i與 b同餘.所以k inv b 與 in...

洛谷 P3812 模板 線性基

這是一道模板題。給定n個整數 數字可能重複 求在這些數中選取任意個,使得他們的異或和最大。第一行乙個數n,表示元素個數 接下來一行n個數 僅一行,表示答案。輸入 1 2 1 1輸出 1 11 n 50,0 si 250 1 leq n leq 50,0 leq s i leq 2 1 n 50,0 ...