P7325 [WC2021] 斐波那契

题目大意如下。

给定 \(m\) 以及 \(q\) 组查询,每次给定 \(a\) 和 \(b\),寻找最小的 \(n\) 使得

\[af_{n-1} \equiv -bf_n \pmod m \]

\(f\) 是斐波那契数列。

Step1 奠定思路

当 \(m\) 是质数的时候,可以直接把斐波那契数列放到一边,查询放到一边,然后预处理一下。

进行查表,可以获得 30 pts。

Step2 推广

现在的问题是 \(a\),\(b\) 和 \(m\) 不一定互质。

咱们首先做一些预备工作,给方程两边同时除以 \(\gcd(a,b)\),\(m\) 除以 \(\gcd(\gcd(a,b),m)\),这个属于同余方程的知识,可以去看我的数论相关内容。

如此以来 \(a \perp b\)。

接着有两个重要结论,一个属于储备知识,一个要现推。

  • \(f_{n-1} \perp f_{n}\)

  • \(\gcd(a,m) = \gcd(f_n,m)\)

下面是第二个结论的证明,证明的第二行是数论相关内容那节乱七八糟技巧里提过的东西。

\(\because af_{n-1} \equiv bf_{n} \pmod m\)
\(\therefore \gcd(af_{n-1}, m) = \gcd(bf_{n}, m)\)
\(\because \gcd(a,m) \mid \gcd(af_{n-1}, m)\)
\(\therefore \gcd(a,m) \mid \gcd(bf_{n}, m)\)
\(\therefore \gcd(a,m) \mid bf_{n}\)
\(\because a\perp b\)
\(\therefore \gcd(a,m) \mid f_{n}\)
\(\therefore \gcd(a,m) \mid \gcd(f_n, m)\)

由于 \(f_{n-1} \perp f_n\),所以 \(\gcd(f_n, m) \mid \gcd(a,m)\) 的证明其实和上面完全一样。

因此 \(\gcd(a,m) = \gcd(f_n,m)\)。

于是两边同除,模数也要除。

除完之后的 \(a\) 和 \(f_n\) 与 \(m\) 互质,因此可以直接参变分离。

具体来讲,\(g = \gcd(a,m) = \gcd(f_n,m)\)

\[\frac{a}{g}f_{n-1} \equiv \frac{f_n}{g}b \pmod {\frac{m}{g}} \]

\[f_{n-1} \times (\frac{f_n}{g}) ^ {-1} \equiv b \times (\frac{a}{g})^{-1} \pmod {\frac{m}{g}} \]

Step3 查表

感觉这部分还是比较需要专门说明的。

我们预处理 \(m\) 的每个因数 \(t\)。对于斐波那契数列模 \(t\) 的情况下,循环节长度是 \(O(t)\) 的,而且是纯循环。因此总枚举复杂度是 \(σ(m)\)。

对于固定的 \(t\),枚举斐波那契数列的下标 \(n\),计算:

\[g' = \gcd(f_n,t) \]

然后更新一下 \([t, g', f_{n-1} \times (\frac{f_n}{g'}) ^ {-1}]\) 的答案即可。

这里为什么要把 \(g'\) 单独开一个维度呢?

因为一个合法的答案是同时要求 \(\gcd(a,t) = \gcd(f_n,t)\) 和 \(f_{n-1} \times (\frac{f_n}{\gcd(f_n, t)}) ^ {-1} \equiv b \times (\frac{a}{\gcd(a,t)})^{-1} \pmod {\frac{t}{\gcd(a,t) = \gcd(f_n,t)}}\) 的。

当然,如果你愿意看,这里还有 GPT6 大人给出的更加可靠的解释。

以下内容为 AI 生成。

我的天哪,GPT6大人(笑

为什么需要单独记录 (g)?

前面我们已经证明,对于合法的答案,必然有

\[\gcd(a,t)=\gcd(f_n,t)=g. \]

但需要注意:这只是原方程成立的必要条件,还不是充分条件。

要使原方程成立,必须同时满足两个条件:

  1. 查询端与预处理端计算出的 gcd 相同。
  2. 约分以后,两边在新模数下的余数相同。

也就是说,

\[af_{n-1}\equiv bf_n\pmod t \]

当且仅当

\[\begin{cases} \gcd(a,t)=\gcd(f_n,t)=g,\\[4pt] b\left(\dfrac ag\right)^{-1} \equiv f_{n-1}\left(\dfrac{f_n}{g}\right)^{-1} \pmod{\dfrac tg}. \end{cases} \]

必要性已经由前面的 gcd 引理和约分推导得到。

对于充分性,如果上述两个条件都成立,那么将第二个同余式两边同时乘以 ((a/g)(f_n/g)),可以得到

\[\frac ag f_{n-1}\equiv b\frac{f_n}{g} \pmod{\frac tg}. \]

再将两边与模数同时乘以 (g),就恢复了原方程:

\[af_{n-1}\equiv bf_n\pmod t. \]

因此,这两个条件合起来才与原方程完全等价。

这也解释了为什么不能只记录最后算出的余数:我们还需要记录 (g),保证查询端与预处理端使用的是同一次合法约分。

所以最终只需将

\[\boxed{(t,g,v)} \]

作为 map 的键,记录对应的最小下标即可。

posted @ 2026-10-15 18:43  Shing03  阅读(2)  评论(0)    收藏  举报