傳送門
考慮說要求乙個
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
−1f
=a0
fn實際上f
nf^n
fn最後就是乙個長度為k
kk的向量
滿足a n=
∑i=1
kcia
ia_n=\sum_^c_ia_i
an=∑i
=1k
cia
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
klo
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 ...