P7325 [WC2021] 斐波那契
题目大意如下。
给定 \(m\) 以及 \(q\) 组查询,每次给定 \(a\) 和 \(b\),寻找最小的 \(n\) 使得
\(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)\)
Step3 查表
感觉这部分还是比较需要专门说明的。
我们预处理 \(m\) 的每个因数 \(t\)。对于斐波那契数列模 \(t\) 的情况下,循环节长度是 \(O(t)\) 的,而且是纯循环。因此总枚举复杂度是 \(σ(m)\)。
对于固定的 \(t\),枚举斐波那契数列的下标 \(n\),计算:
然后更新一下 \([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 相同。
- 约分以后,两边在新模数下的余数相同。
也就是说,
当且仅当
必要性已经由前面的 gcd 引理和约分推导得到。
对于充分性,如果上述两个条件都成立,那么将第二个同余式两边同时乘以 ((a/g)(f_n/g)),可以得到
再将两边与模数同时乘以 (g),就恢复了原方程:
因此,这两个条件合起来才与原方程完全等价。
这也解释了为什么不能只记录最后算出的余数:我们还需要记录 (g),保证查询端与预处理端使用的是同一次合法约分。
所以最终只需将
作为 map 的键,记录对应的最小下标即可。

浙公网安备 33010602011771号