题目意思:
已知 fn=(fn-1^b1 * fn-2^b2 *...* fn-k^bk) mod 998244353, 其中 b1,b2,...bk都知道,fn=m,n,k,m是给你的数字.要求fk
如果不存在,就输出-1
思路:
官方题解是这样表述的:
1.998244353 是一个质数,而且很特殊,它的原根是3
2.原根(设g是p的原根)的性质有以下两条:(1)g^(p-1) mod p =1 (2) 任意k在[1,p-1)范围内,都有g^k mod p ≠ 1
3.由原根的第二条性质,可以推出下面一条性质: 对 1<=x<y<p-1 来说,一定有g^x mod p不等于 g^y mod p
4.有了上面这条性质,可以设一个函数: g^q(x) = x (mod p) ,其中,g=3,p=998244353,而且这个函数一定是一个双射函数
5.设h1,h2...hk-1 ,其中hi = q(fi)
6.那么fn的原式变为: 左边: g^hn , 右边变为: g^∑{j=1}{j=k}(hi-j * bj)mod p
7.由 “4”,可以得到 hn = ∑{j=1}{j=k}(hi-j * bj)mod p
8.由费马小定理,hn mod (p-1) = ∑{j=1}{j=k}(hi-j * bj)mod (p-1)
9.有这个推式可以想得到“矩阵快速幂”,其中,bj是每一项的系数
10.由“8”,可以猜测 hn = C*hk mod (p-1),其中C是一个常数(通过矩阵快速幂来得到)
11.设一个递推矩阵为"A":
b1,b2......bk
1,0,..........0
0,1...........0
0,0,1........0
........
0,0........1,0
12. 设一个系数矩阵为“B”:
hk-1
hk-2
..
..
h2
h1
13.那么,容易得到B_n = A^(n-k)*B
14.C = B_n[0][0]
15.观察式子: fn = g^hn,已知fn,g,怎么求hn? ===》BSGS算法,得到hn
16.有了hn和g,怎么算hk? ====》 观察式子: hn = C*hk (mod p-1),可以把式子转化为模线性方程,代入exgcd(hn,p-1)得到hk(或-1)
17.有了hk,观察式子:fk = g^hk (mod p),这时只要用快速幂算法,代入qpow(g,hk,p)即可