P7325 [WC2021] 斐波那契
P7325 [WC2021] 斐波那契
https://www.luogu.com.cn/problem/P7325
好题,每一步都在能力范围之外。
首先 把 \(F_n\) 写为 \(a\times fib_{n-1}+b\times fib_{n}\)。再令 \(b\leftarrow -b\),得到
\(fib_n\) 在 \(\bmod m\) 意义下纯循环,循环节长为 \(O(m)\)。所以只有 \(O(m)\) 个 \(fib_n\) 有用。
我们希望写成 \(\frac a b\equiv \frac{fib_n}{fib_{n-1}}\) 的形式,但可能没有逆元。
首先令 \(d=\gcd(a,b,m),a'=\frac a d,b'=\frac b d,m'=\frac m d\),
此时 \(\gcd(a',b',m')=1\),但 \(\gcd(a',m'),\gcd(b',m')\) 不一定为 \(1\)。
由辗转相除法,\(\gcd(a'\times fib_{n-1},m')=\gcd(b'\times fib_n,m')\)。
设 \(z\mid \gcd(a',m')\)。此时 \(z\nmid \gcd(b',m')\),否则与 \(a',b',m'\) 互质矛盾。所以 \(z\mid \gcd(fib_n,m')\)。
设 \(z\mid \gcd(fib_n,m')\)。由 \(fib_n \perp fib_{n-1}\),\(z\mid \gcd(a',m')\)。
所以 \(\gcd(a',m')=\gcd(fib_n,m')=x\)。同理得到 \(\gcd(b',m')=\gcd(fib_{n-1},m')=y\)。
所以
这样就有逆元了:
但我们不可能求出 \(fib_n\) 真正的值。但注意到 \(\gcd(fib_n,m')=\gcd(fib_n\bmod m',m')\),所以求出 \(fib_n \bmod m'\) 即可。
查询时,先求出 \(m'\),然后得到 \(x,y\),寻找 \(\gcd(fib_n,m')=x,\gcd(fib_{n-1},m')=y,\frac{fib_{n}}{x}\times (\frac{fib_{n-1}}{y})^{-1}\equiv \frac{a'}{x}\times (\frac{b'}{y})^{-1} \pmod{\frac{m'}{xy}}\) 的最小 \(n\)。
所以需要枚举 \(m'\),将 \((x,y,\frac{fib_{n}}{x}\times(\frac{fib_{n-1}}{y})^{-1}\bmod \frac{m'}{xy})\) 塞进 map 或哈希表中,查表即可。
复杂度 \(O(\sigma(m)\log m)\),\(\sigma(m)\) 为因数和,为 \(O(m\log \log m)\) 量级。
特判 \(a=0\) 或 \(b=0\) 或 \(fib \bmod m'=0\) 或 \(fib \bmod m'=0\) 的情况,此时没有逆元。

浙公网安备 33010602011771号