Codeforces Round #536 (Div. 2) F

题目意思:

已知 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

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)即可

 

你可能感兴趣的:(数论,矩阵快速幂,数学)