当前位置: 首页 > news >正文

洛谷P2714 四元组统计 题解 莫比乌斯反演

解决本题的核心在于利用莫比乌斯反演或容斥原理,将“最大公约数(\(\gcd\))等于 1”的限制转化为“统计倍数个数”。

核心思路

直接统计 \(\gcd(a_i, a_j, a_k, a_l) = 1\) 的四元组非常困难,因此我们采用莫比乌斯反演进行转化:

根据莫比乌斯函数的性质:\(\sum_{d|n} \mu(d) = [n=1]\)

我们可以将要求的答案表示为:

\[\text{Ans} = \sum_{i,j,k,l} [\gcd(a_i, a_j, a_k, a_l) = 1] = \sum_{i,j,k,l}\ \sum_{d | \gcd(a_i, a_j, a_k, a_l)} \mu(d) \]

交换求和符号,先枚举因数 \(d\)

\[\text{Ans} = \sum_{d=1}^{\max(a)} \mu(d) \cdot \text{计算从序列中选出 4 个数全为 } d \text{ 的倍数的方案数} \]

\(f(d)\) 为输入序列中 \(d\) 的倍数 的元素个数。那么在这些倍数中任意挑选 4 个数组成四元组的方案数就是组合数 \(\binom{f(d)}{4}\)。因此,最终的计算公式为:

\[\text{Ans} = \sum_{d=1}^{\max(a)} \mu(d) \cdot \binom{f(d)}{4} \]

具体算法步骤

  1. 预处理莫比乌斯函数 \(\mu\):用线性筛求出 \(1\) 到值域最大值 \(\max(a)\) 之间所有数的 \(\mu(d)\) 值。
  2. 计数频次:用一个桶数组 cnt[x] 统计每个数字在输入序列中出现的次数。
  3. 计算 \(f(d)\):通过调和级数复杂度的循环来统计 \(d\) 的倍数个数。即 \(f(d) = \sum_{d \mid x} cnt[x]\),时间复杂度为 \(O(M \log M)\),其中 \(M = \max(a)\)
  4. 累加贡献:遍历所有的 \(d\),如果 \(f(d) \ge 4\),则计算组合数并将 \(\mu(d) \cdot \binom{f(d)}{4}\) 累加到答案中。

示例程序

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e4, maxn = N + 5;bool isp[maxn];
int n, mu[maxn], c[maxn], C[maxn];void init() {vector<int> primes;mu[1] = 1;for (int i = 2; i <= N; i++) {if (!isp[i]) {primes.push_back(i);mu[i] = -1;}for (auto &j : primes) {if (i * j > N) break;isp[i * j] = true;if (i % j == 0) {mu[i * j] = 0;break;}else {mu[i * j] = mu[i] * (-1);}}}
}ll f(int a) {if (a < 4) return 0;return 1ll * a * (a-1) * (a-2) * (a-3) / (4 * 3 * 2);
}int main() {init();while (~scanf("%d", &n)) {memset(c, 0, sizeof c);memset(C, 0, sizeof C);for (int i = 0, a; i < n; i++) {scanf("%d", &a);c[a]++;}for (int i = 1; i <= N; i++) {for (int j = i; j <= N; j += i)C[i] += c[j];}ll ans = 0;for (int i = 1; i <= N; i++)ans += mu[i] * f(C[i]);printf("%lld\n", ans);}return 0;
}
http://www.jsqmd.com/news/840150/

相关文章:

  • 书匠策AI降重降AIGC全拆解:http://www.shujiangce.com 这个“论文急救站“到底靠不靠谱?
  • 辽宁高质量草坪批发基地实测排行 品质供货全维度对比 - 奔跑123
  • 使用Node.js与Taotoken构建一个简单的多轮对话代理服务
  • 2026年AI智能体大爆发:Claude Code、GPT-5.3、三大Agent实测,哪个真正能替你干活?
  • 深度解析Universal-IFR-Extractor:终极固件内部表单提取技术实战指南
  • 给STM32H7开发者的USB协议栈避坑指南:从硬件选型到代码调试的完整流程
  • 2026年4月行业内评价高的不锈钢法兰厂商推荐,变压器法兰/不锈钢法兰/高温合金法兰,不锈钢法兰生产厂家哪家权威 - 品牌推荐师
  • Pearcleaner:你的macOS数字管家,彻底告别应用残留的终极清理方案
  • 2026年4月工业纸箱联动线公司推荐,纸箱粘钉联动线/工业纸箱联动线,工业纸箱联动线制造厂家口碑推荐 - 品牌推荐师
  • ATCC病毒生产厂家与进口代理商怎么选?质量、售后、价格三维对比指南 - 品牌推荐大师
  • ARM P1100嵌入式系统接口架构与设计解析
  • 论文AI率超标怎么办?实测3款高性价比降AIGC工具(附综合对比)
  • 构建生产级AI Web应用(Claude+Flask架构全拆解)
  • 2026年松江区交通事故纠纷律所评测:四家机构核心能力对比 - 奔跑123
  • 手机离线跑AI这个事,是不是智商税?
  • # 2025-2026-2 《Python程序设计》实验四报告
  • 为内部 AI 应用平台集成 Taotoken 实现多模型路由与灾备方案
  • Markdown Viewer架构设计:多编译器统一接口与模块化渲染系统实践
  • 终极指南:如何让Windows任务栏完美透明化,提升桌面美观度
  • Taotoken的APIKey管理与审计日志如何助力企业合规
  • 东北区域主流草坪基地品牌实测排行与采购参考 - 奔跑123
  • 谁在守护四川地下管网?2026年市政非开挖修复厂家深度测评——捷顺通领跑本土梯队 - 深度智识库
  • 使用标准库例程串口乱码
  • linux ubuntu 挂载硬盘
  • 涿州本地防盗门品牌实测评测:安全与服务双维度对比 - 奔跑123
  • tmpr3z5vs82
  • 沈阳漏水检测/漏水维修/防水补漏/卫生间漏水/水管漏水师傅专题:沈阳一修哥漏水检测维修布局和平区等地深度问答 - 十大品牌榜
  • 辽宁草坪价格实测排行:五家源头基地性价比对比 - 奔跑123
  • 论APS智能排产:让生产排程从“经验博弈“到“智能决策“的进化
  • GitHub加速终极指南:如何用开源插件将下载速度提升30倍