+++ date = "2019-02-02T01:15:00+08:00" draft = false tags = [] title = "Problem F, CF Round #536 (Div. 2)" summary = "Solution of [Lunar New Year and a Recursive Sequence](https://codeforces.com/contest/1106/problem/F)" authors = ["xry111"] +++ # 问题描述 [原题目链接](https://codeforces.com/contest/1106/problem/F)。 已知 $p = 998244353$,数列 $\\{f\_i\\}$ 满足 $$f\_i = \\left( \\prod\_{j=1}^k f\_{i-j}^{b\_j} \\right) \\mod p$$ 且 $f\_1 = f\_2 = \\cdots = f\_{k-1} = 1$,$f\_n = m$, 给定一组正的 $m$、$k$、$b\_1 \\cdots b\_k$,求 $f\_k$ 的任意一个可能值, 或报告没有可能的值。 # 解决方法 注意到 $p$ 是一个奇质数,根据原根定理知道存在 $\\omega$ ,使得 $\\omega^0, \cdots, \\omega^{p-2}$ 两两不同。[询问 WolframAlpha][1] 知道 $\\omega = 3$,以此可以定义 $\\{0, \cdots, p-2\\}$ 与 $\\{1, \cdots, p-1\\}$ 之间的双射。正映射就是我们很熟悉的 $$f(x) = 3^x \\mod p$$ 逆映射就是离散对数: $$f^{-1}(y) = Ind\_3 (y)$$ [1]: https://www.wolframalpha.com/input/?i=primitive+root+of+998244353 众所周知,可以用[大步小步法][BSGS]在 $O(\\sqrt{p})$ 的时间内求出离散对数。 下面令 $g\_i = Ind\_3 (f\_i)$,那么递归式就等价于 $$g\_i = \\left( \\sum\_{j=1}^k b\_j g\_{i-j} \\right) \\mod (p-1)$$ 在模 $p-1$ 意义下这是个线性递推数列,可以写成矩阵形式: $$\\gamma\_n = \\begin{bmatrix} g\_n \\\\ g\_{n-1} \\\\ \\vdots \\\\ g\_{n-k+2} \\\\ g\_{n-k+1} \\end{bmatrix} = \\begin{bmatrix} b\_1 & b\_2 & \cdots & b\_{k-1} & b\_k \\\\ 1 & & & & \\\\ & 1 & & & \\\\ & & \ddots & & \\\\ & & & 1 & \\\\ \\end{bmatrix} \\begin{bmatrix} g\_{n-1} \\\\ g\_{n-2} \\\\ \\vdots \\\\ g\_{n-k+1} \\\\ g\_{n-k} \\end{bmatrix} $$ 所以 $$\\gamma\_n = A^{n-k} \\gamma\_k = B \\gamma\_k$$ 这里 $B = A^{n-k}$ 可以用矩阵快速幂求出。根据题目条件, $$\\gamma\_k = [g\_k, \cdots, g\_1]^T = [g\_k, 0, \cdots, 0]^T$$ 可以看出 $g\_n = B\_{11} g\_k$。其中 $g\_n = Ind\_3 (m)$ 可用大步小步法求出,$B$ 左上角的元素 $B\_{11}$ 可用快速幂求出, 下面就要求 $g\_k$。这里的问题在于,同余方程 $$g\_n \equiv B\_{11} g\_k \\quad~~ (mod \\quad p-1)$$ 中的模 $p-1 = 2^{23} \cdot 7 \cdot 17$ 是一个合数,所以不能用逆元。 我们可以用中国剩余定理把它拆成三个同余方程组成的方程组: $$g\_n \equiv B\_{11} g\_k \\quad~~ (mod \\quad 7)$$ $$g\_n \equiv B\_{11} g\_k \\quad~~ (mod \\quad 17)$$ $$g\_n \equiv B\_{11} g\_k \\quad~~ (mod \\quad 2^{23})$$ [中国剩余定理][CRT]告诉我们原同余方程的解和拆分得到同余方程组的解一一对应, 所以只要解拆分出来的这三个方程即可。对于前两个方程,特判 $B\_{11}$ 余 $0$ 的情况(其中如果 $g\_n$ 也余 $0$,则 $g\_k$ 可以余任何数, 否则无解),然后用逆元即可。 对于第三个方程,由于 $B\_{11}$ 可能与 $2^{23}$ 不互质,可能不存在逆元。 首先仍然特判 $B\_{11}$ 余 $0$ 的情况,然后对 $g\_n$ 和 $B\_{11}$ 同时除以 $gcd(B\_{11}, 2^{23})$。如果除不尽,说明无解。否则,新得到的方程中 $B\_{11} / gcd(B\_{11}, 2^{23})$ 一定与 $2^{23}$ 互质,就能用逆元了。 如果这三个方程中有一个或多个无解,则原同余方程一定无解。如果它们都有解, 就能用中国剩余定理得到原方程的一个解,即 $g\_k$ 的一个可能值。 然后直接快速幂就能得到 $f\_k = 3^{g\_k} \mod p$。 [BSGS]: https://en.wikipedia.org/wiki/Baby-step_giant-step [CRT]: https://en.wikipedia.org/wiki/Chinese_remainder_theorem [参考代码](https://codeforces.com/contest/1106/submission/49271312)。