1 条题解
-
0
好的,这道题是模意义下广义斐波那契数列找最早为零的位置的问题。
问题转化
我们定义:
F 0
a , F 1
b , F i
( F i − 1 + F i − 2 ) mod m ( i ≥ 2 ) F 0 =a,F 1 =b,F i =(F i−1 +F i−2 )modm(i≥2) 要求最小的 p p 使得 F p
0 F p =0。
特殊情况分析 如果 a ≡ 0 ( m o d m ) a≡0(modm),那么 p
0 p=0 就是一个解(因为 F 0
0 F 0 =0)。
如果 a ≢ 0 a ≡0,我们需要找 p ≥ 1 p≥1 使得 F p
0 F p =0。
关键观察
这个递推是线性的,可以写成矩阵形式:
[ F i F i + 1 ]
[ 0 1 1 1 ] ⋅ [ F i − 1 F i ] [ F i
F i+1
]=[ 0 1
1 1 ]⋅[ F i−1
F i
] 初始向量为 ( a , b ) T (a,b) T 。
我们要求最小的 p p 使得:
F p ≡ 0 ( m o d m ) F p ≡0(modm) 这等价于在模 m m 下,序列在位置 p p 首次为零。
求解思路
由于 m ≤ 10 5 m≤10 5 ,我们可以利用序列在模 m m 下必然循环的性质。
循环性质
状态 ( F i , F i + 1 ) (F i ,F i+1 ) 最多有 m 2 m 2 种可能,所以序列必然进入循环,且循环节长度 ≤ m 2 ≤m 2 。 但 m 2 m 2 可能很大(1e10),不能直接枚举。
优化方法
Pisano period 思想 对于质数模数,斐波那契零点的出现有理论结果,但这里 m m 是合数且初始值任意 a , b a,b,不能直接套用。
Meet-in-the-middle / 生日悖论 我们找最小的 p
0 p>0 使得 F p ≡ 0 F p ≡0。 我们可以用哈希表记录每个 F i F i 出现的最早位置,当遇到重复状态时停止。
但直接从头开始模拟,最坏情况可能很长(接近 m 2 m 2 ),会超时。
正解框架
实际上,这个问题可以转化为:
如果 gcd ( a , m )
g gcd(a,m)=g,那么所有 F i F i 都是 g g 的倍数(在模 m m 意义下)。
令 a ′
a / g ,
b ′
b / g ,
m ′
m / g a ′ =a/g, b ′ =b/g, m ′ =m/g,则问题转化为模 m ′ m ′ 下的同类问题,且 gcd ( a ′ , m ′ )
1 gcd(a ′ ,m ′ )=1。
进一步,问题等价于在模 m ′ m ′ 下找最小的 p p 使得:
a ′ ⋅ f p − 1 + b ′ ⋅ f p ≡ 0 ( m o d m ′ ) a ′ ⋅f p−1 +b ′ ⋅f p ≡0(modm ′ ) 其中 f f 是标准斐波那契数列 f 0
0 , f 1
1 f 0 =0,f 1 =1。
实现方法
对于小范围 m ≤ 10 5 m≤10 5 ,一种可行的方法是:
特判 a ≡ 0 a≡0 的情况。
否则,模拟序列直到出现 F p
0 F p =0 或者状态重复。
利用循环节检测,如果发现循环且没遇到 0,输出 -1。
但为了通过大数据,需要更数学的方法:
对 m m 做质因数分解,利用中国剩余定理将问题分解到素数幂模数下求解,最后合并周期。
结论
本题是数论与斐波那契数列模周期的综合题,核心是状态循环与模数分解。 对于 n , m ≤ 10 5 n,m≤10 5 ,若采用直接模拟加循环检测,可能只能通过小数据;要过大数据,需用数学方法减少枚举量。
- 1
信息
- ID
- 5197
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者