题目预估难度:2100
算法需求:矩阵快速幂、欧拉降幂、原根、BSGS、exgcd
问题拆解:
首先看到幂次和乘积,想到使用原根进行取对数
f
i
=
∏
j
=
1
s
i
z
e
o
f
(
b
)
f
i
−
j
b
j
(
m
o
d
p
)
(
i
>
s
i
z
e
o
f
(
b
)
)
f_i=\prod_{j=1}^{sizeof(b)}f_{i-j}^{b_j}(mod \ p)(i>sizeof(b))
fi=∏j=1sizeof(b)fi−jbj(mod p)(i>sizeof(b))
->
f
i
=
g
g
i
%
p
f_i=g^{g_i}\%p
fi=ggi%p
g
g
i
=
∏
j
=
1
s
i
z
e
o
f
(
b
)
g
g
i
−
j
∗
b
j
(
m
o
d
p
)
(
i
>
s
i
z
e
o
f
(
b
)
)
g^{g_i}=\prod_{j=1}^{sizeof(b)}g^{g_{i-j}*{b_j}}(mod \ p)(i>sizeof(b))
ggi=∏j=1sizeof(b)ggi−j∗bj(mod p)(i>sizeof(b))
g
i
=
∑
j
=
1
s
i
z
e
o
f
(
b
)
g
i
−
j
∗
b
j
g_i=\sum_{j=1}^{sizeof(b)}g_{i-j}*b_j
gi=∑j=1sizeof(b)gi−j∗bj
换成这种式子,看着n取到了1e9,而且b的大小只有100
所以一般会想到矩阵快速幂,当然,在确定要快速幂之前,就得注意,快速幂的是幂次,要使用的是欧拉降幂,所以模数变成
ϕ
(
p
)
\phi(p)
ϕ(p)
之后可以直接推导转移矩阵B
[
f
n
f
n
−
1
.
.
.
f
n
−
s
i
z
e
o
f
(
b
)
+
1
]
\begin{bmatrix} f_n &f_{n-1}&...&f_{n-sizeof(b)+1} \end{bmatrix}
[fnfn−1...fn−sizeof(b)+1]
=
[
f
n
−
1
f
n
−
2
.
.
.
f
n
−
s
i
z
e
o
f
(
b
)
]
\begin{bmatrix} f_{n-1}&f_{n-2}&...&f_{n-sizeof(b)} \end{bmatrix}
[fn−1fn−2...fn−sizeof(b)]*
[
b
1
1
.
.
.
0
b
2
0
.
.
.
0
.
.
.
.
.
.
.
.
.
.
.
.
b
n
−
2
0
.
.
.
1
b
n
−
1
0
.
.
.
0
]
\begin{bmatrix} b_1& 1 &...&0 \\ b_2 & 0 &...&0 \\ ...&...&...&...\\b_{n-2} & 0&...&1\\b_{n-1}&0&...&0\end{bmatrix}
⎣⎢⎢⎢⎢⎡b1b2...bn−2bn−110...00...............00...10⎦⎥⎥⎥⎥⎤
一开始的前一个矩阵A就是
[
g
k
0
.
.
.
0
]
\begin{bmatrix} g_k&0&...&0\end{bmatrix}
[gk0...0]
通过矩阵快速幂,可以得到
f
n
f_n
fn=
g
A
∗
B
n
−
k
g^{A*{B^{n-k}}}
gA∗Bn−k的第一列
其实也就是
f
n
=
g
g
k
∗
B
n
−
k
1
,
1
f_n=g^{g_k*{B^{n-k}}_{1,1}}
fn=ggk∗Bn−k1,1
那么通过BSGS把
f
n
f_n
fn对应的
g
n
g_n
gn求出来
我们就可以得到方程
g
n
=
x
∗
B
n
−
k
1
,
1
(
m
o
d
ϕ
(
p
)
)
g_n=x*{B^{n-k}}_{1,1}(mod\ \phi(p))
gn=x∗Bn−k1,1(mod ϕ(p))
那么求
B
n
−
k
1
,
1
{B^{n-k}}_{1,1}
Bn−k1,1在
m
o
d
ϕ
(
p
)
mod\ \phi(p)
mod ϕ(p)意义下的逆元
这个用exgcd来做就可以了
如果不存在逆元,那么就是-1
最后把求出来的
g
k
g_k
gk快速幂一下,就可以得出
f
k
=
g
g
k
f_k=g^{g_k}
fk=ggk