1 条题解
-
0
题意简化
给定 个数 ,求:
其中 是斐波那契数列:。
,。
核心思想:数论性质 + 容斥
1. 斐波那契数列的性质
关键性质:
- 由这个性质可以推导出 LCM 的表达式
2. LCM 公式推导
对于数列 ,有:
$$LCM(f(k_1), f(k_2), ..., f(k_n)) = \prod_{d=1}^{\max(k_i)} f(d)^{c_d} $$其中指数 由包含因子 的 决定。
更具体地,利用莫比乌斯反演:
其中 是某个函数。
反过来:
3. 代码算法解析
预处理部分:
- 线性筛:计算莫比乌斯函数
- 斐波那契数列:计算 模
- 计算 :使用公式
代码实现巧妙:
// 初始化 g[i] = f[i] for (int i = 1; i <= n; i++) g[i] = f[i]; // 通过除法计算 g for (int i = 1; i <= n; i++) { int t = qpow(g[i], mod-2); // g[i] 的逆元 for (int j = i+i; j <= n; j += i) g[j] = g[j] * t % mod; }这等价于:
主计算部分:
- 读入 ,标记
p[k_i] = true - 对于每个 ,检查是否存在 是 的倍数
- 如果存在,则将 乘入答案
为什么这样正确?
- 表示斐波那契数 的某种"本原"因子
- 如果存在 是 的倍数,那么 会"贡献"到 的质因子分解中
- 求 LCM 时需要包含所有 ,其中 能整除至少一个
算法步骤
-
预处理(到 ):
- 线性筛
- 计算 模
- 计算
-
读入处理:
- 记录最大的 为
- 标记哪些 值出现过
-
计算答案:
ans = 1 for i = 1 to mx: flag = false for j = i; j <= mx; j += i: if p[j]: flag = true break if flag: ans = ans * g[i] % mod
复杂度分析
- 预处理:,
- 标记 :
- 计算答案:每个 检查倍数,总复杂度
- 可过
关键点
1. 数论公式
$$LCM(f(k_1),...,f(k_n)) = \prod_{d} g(d)^{[\exists k_i \text{是} d \text{的倍数}]} $$2. 的计算
是 的莫比乌斯反演,表示"本原"因子。
3. 倍数检查
只需检查是否存在 是 的倍数,不需要统计个数。
样例解释
输入:
斐波那契值:
LCM = LCM(1,2,8,34) = 136
代码特点
- 预处理到 (最大 )
- 使用莫比乌斯反演
- 逆元优化 的计算
- 倍数标记检查
- 1
信息
- ID
- 6024
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者