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

B. Crimson Triples(Codeforces 2238)

B. Crimson Triples - 题解

题意简述

给定n,要统计有多少个有序三元组(a, b, c)满足:

1 <= a, b, c <= n

并且:

gcd(lcm(a, b), lcm(b, c)) = gcd(a, c)

注意三元组是有序的,(1, 2, 3)(3, 2, 1)算不同。

核心结论

一个三元组(a, b, c)满足条件,当且仅当:

b | a 且 b | c

也就是b同时整除ac

接下来解释为什么。

从质因数指数理解

任意正整数都可以拆成质因数。
我们只看某一个质因子p

pa, b, c中出现的次数分别为:

x = v_p(a) y = v_p(b) z = v_p(c)

例如:

a = 12 = 2^2 * 3^1 v_2(12) = 2 v_3(12) = 1

对于质因数指数,有两个基本规则:

v_p(gcd(u, v)) = min(v_p(u), v_p(v)) v_p(lcm(u, v)) = max(v_p(u), v_p(v))

所以原式左边在质因子p上的指数是:

v_p(gcd(lcm(a, b), lcm(b, c))) = min(max(x, y), max(y, z))

右边在质因子p上的指数是:

v_p(gcd(a, c)) = min(x, z)

因此要求:

min(max(x, y), max(y, z)) = min(x, z)

化简这个条件

观察左边:

max(x, y) >= y max(y, z) >= y

所以:

min(max(x, y), max(y, z)) >= y

如果y > min(x, z),那么左边至少是y,会严格大于右边,条件不成立。

如果y <= min(x, z),说明:

y <= x 且 y <= z

于是:

max(x, y) = x max(y, z) = z

左边变成:

min(x, z)

正好等于右边。

所以对于每一个质因子,都必须且只需满足:

y <= x 且 y <= z

翻译回整数就是:

b | a 且 b | c

计数方法

固定中间的数b

由于必须满足:

b | a b | c

所以ac都必须是b的倍数。

1..n中,b的倍数有:

floor(n / b)

个:

b, 2b, 3b, ..., floor(n / b) * b

a可以任选一个倍数,c也可以任选一个倍数,所以固定b时贡献为:

floor(n / b) * floor(n / b)

把所有b = 1..n的贡献加起来:

answer = sum_{b=1}^{n} floor(n / b)^2

图表示意

n = 6为例:

固定的b1..6b的倍数可选数量m=floor(n/b)贡献m^2
11, 2, 3, 4, 5, 6636
22, 4, 639
33, 624
4411
5511
6611

总答案:

36 + 9 + 4 + 1 + 1 + 1 = 52

也可以这样理解:

固定 b a 的选择:b, 2b, 3b, ... c 的选择:b, 2b, 3b, ... 每一个 a 都可以和每一个 c 配对,所以是一个 m * m 的方阵。

算法流程

对每个测试用例:

  1. 读入n
  2. 初始化ans = 0
  3. 枚举b1n
  4. m = n / b
  5. 累加ans += m * m
  6. 输出ans

易错点

  1. 三元组是有序的,ac不能合并计数。
  2. 不是统计gcd(a, c)的值,而是统计所有满足条件的(a, b, c)
  3. 答案可能很大,必须使用long long。例如n = 200000时,光是b = 1的贡献就是200000^2 = 40000000000
  4. 题目保证所有测试用例的n之和不超过2 * 10^5,所以每个测试用例直接O(n)枚举是足够的。

复杂度分析

设所有测试用例的n之和为S

时间复杂度:O(S) 空间复杂度:O(1)

其中题目保证S <= 2 * 10^5

C++ 代码实现

#include<bits/stdc++.h>usingnamespacestd;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intT;cin>>T;while(T--){longlongn;cin>>n;longlongans=0;// 固定中间的 b。// 条件等价于 b | a 且 b | c。// 在 1..n 中,b 的倍数有 floor(n / b) 个。for(longlongb=1;b<=n;++b){longlongmultiples=n/b;ans+=multiples*multiples;}cout<<ans<<'\n';}return0;}
http://www.jsqmd.com/news/1141865/

相关文章:

  • STM32G0B1RE与171010550实现高效DC-DC降压转换方案
  • 3步精通猫抓cat-catch:浏览器资源嗅探扩展的完整实战指南
  • ICM-42688-P与PIC18LF45K22在机器人运动控制中的应用
  • 2026企业级AI Agent智能体开发平台推荐 五大主流产品中立测评选型指南
  • STM32数字电源设计:PWM控制与DC-DC降压转换
  • B站视频下载神器:解锁大会员4K高清与充电专属内容的智能方案
  • 嵌入式EEPROM存储方案:M95M04与MKV44F128VLH16实战
  • Codex 国内使用方法
  • 惠普暗影精灵笔记本性能控制终极指南:OmenSuperHub完整使用教程
  • STM32与Si5351A时钟系统设计及汽车电子应用
  • 掏耳勺摄像头好用吗?哪种掏耳朵方式好?可视掏耳勺闭眼入清单
  • SOFA v25.12 软体机器人仿真:从 Gmsh 建模到 CableGripper 完整项目实战
  • MAA明日方舟自动化助手:高效游戏管理的终极解决方案
  • STM32G031K8驱动MCP3551 ADC的高精度数据采集方案
  • AI建站避坑指南:10个最常见问题与风险解答
  • DS28EC20与dsPIC33EP的1-Wire EEPROM存储方案详解
  • allure的安装及配置
  • GBFR-Logs:从数据迷雾到精准战斗分析的开源DPS统计工具
  • 如何快速管理空洞骑士模组:Lumafly跨平台模组管理器终极指南
  • 5步掌握鲁棒管模型预测控制:MATLAB实战教程与扰动处理终极指南
  • 英雄联盟Akari助手:一键自动化提升游戏体验的终极指南
  • 安装Neovim
  • 网页内容永久保存:WebToEpub让在线阅读变离线收藏
  • Hermes Agent自进化AI代理:安装配置与生产环境部署指南
  • MAX9744与TM4C123GH6PZ音频系统设计与优化
  • SecHex-Spoofy:如何在用户模式下全面重塑你的硬件指纹
  • 揭秘AMD Ryzen隐藏性能:免费开源SMUDebugTool完全掌控指南
  • 如何让10美元鼠标成为macOS效率革命的终极武器
  • MAX9744与PIC32MX675F512L构建高效数字音频系统
  • 量化策略回测:基于“机构擒牛”源码的3年A股数据验证与2个参数优化