题解

题目预估难度: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)fijbj(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)ggijbj(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)gijbj
换成这种式子,看着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} [fnfn1...fnsizeof(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} [fn1fn2...fnsizeof(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...bn2bn110...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}}} gABnk的第一列
其实也就是
f n = g g k ∗ B n − k 1 , 1 f_n=g^{g_k*{B^{n-k}}_{1,1}} fn=ggkBnk1,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=xBnk1,1(mod ϕ(p))
那么求 B n − k 1 , 1 {B^{n-k}}_{1,1} Bnk1,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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值