1. 题目背景与核心需求解析
P4752 Divided Prime是信奥竞赛中一道考察数论基础与算法优化的经典题型。题目给定两个整数集合A和B,要求判断A中所有元素乘积除以B中所有元素乘积的结果是否为质数。这道题看似简单,实则暗藏多个需要谨慎处理的边界条件和技术要点。
1.1 题目数学本质
从数学角度分析,题目要求验证表达式(∏A)/(∏B)的质数性。根据算术基本定理,任何大于1的整数都可以唯一分解为质因数的乘积。因此我们需要确保:
- 最终结果大于1
- 质因数分解后仅包含一个质数(即其本身)
- 该结果不能由B集合中的元素抵消后产生(特殊情况处理)
1.2 输入输出特性分析
根据常见竞赛数据范围:
- 集合元素数量n,m ≤ 1e5
- 单个元素值 ≤ 1e12
- 时间限制通常为1秒
这意味着:
- 直接计算乘积会溢出(即使使用long long)
- O(n²)的算法会超时
- 需要线性或线性对数级别的解法
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法设计与优化
2.1 质因数分解法
常规思路是对所有数进行质因数分解,然后统计各质因数的总出现次数。但直接分解大数(1e12)效率太低,需要优化:
cpp复制void factorize(long long x, map<long long, int>& factors) {
for (long long i = 2; i * i <= x; ++i) {
while (x % i == 0) {
factors[i]++;
x /= i;
}
}
if (x > 1) factors[x]++;
}
优化点:
- 只需遍历到√x即可
- 用map记录质因数及其次数
- 处理剩余的大质数情况
2.2 差分计数法
分别处理A和B集合的质因数后,计算它们的差:
cpp复制map<long long, int> diff;
for (auto& [p, cnt] : factorsA) diff[p] += cnt;
for (auto& [p, cnt] : factorsB) diff[p] -= cnt;
最终有效的质因数应满足
