CF1900D - Small GCD 题解
1900D - Small GCD
给定序列 \(A\),定义 \(f(a, b, c)\) 为 \(a, b, c\) 中最小的次小的数的 \(\gcd\),求:
\]
题解
目前来说有两种方法,都十分有启发意义,但是有共同的开头。
考虑到 \(A\) 的顺序实际上没有什么关系,那么可以先对 \(A\) 排序,使得 \(i < j < k \iff a_i \le a_j \le a_k\),那么此时 \(f(a_i, a_j, a_k) = \gcd(a_i, a_j)\),从而答案的式子转化为:
\]
接下来衍生出了两种做法。
莫比乌斯反演
准确来说应该是欧拉反演?
注意到:
\]
那么我们可以将目标表达式写为:
\]
交换求和顺序,可以得到:
& \sum_{d = 1}^V \varphi(d) \sum_{i = 1}^n \sum_{j = i + 1}^n [d | a_i] [d | a_j] (n - j) \\
= & \sum_{d = 1}^V \varphi(d) \sum_{j = 1}^n (n - j) [d | a_j] \sum_{i = 1}^{j - 1} [d | a_i]
\end{aligned}
\]
考虑对于每一个 \(d\),我们将满足 \(d | a_i\) 的数提出来作为集合 \(S\),那么这是容易 \(O(|S|)\) 求解的。
接下来我们只需要考虑其复杂度了。
注意到可以认为 \(\tau(n) = O(\sqrt n)\)(在本题值域限制中 \(\tau(n) \le 128\))也就是说每一个数至多在 \(128\) 个 \(S\) 中出现,那么我们可以知道 \(\sum |S| = O(128n)\),于是复杂度是合理的。
\(\tau(n)\) 表示 \(n\) 的因数个数。
提前预处理一下因数的分解,这是 \(O(V \log V)\) 的(由于值域很小,可以直接保存),以及 \(\varphi\) 即可。
总复杂度是 \(O(V \log V + 128n + n \log n)\)。
另类的枚举
回到基础的式子:
\]
如果我们固定 \(j\),发现 \(\gcd(a_i, a_j)\) 一定是 \(a_j\) 的因数,并且 \(a_j\) 的因数至多有 \(128\) 个,这启发我们可以直接枚举 \(d = \gcd(a_i, a_j)\) 来算 \(d \times cnt_j \times (n - j)\)。
考虑 \(cnt_j\) 该如何计算,可以开一个桶 \(but_x\) 记录有多少个满足 \(x | a_i\) 的数。
发现并不能简单的 \(cnt_j = but_d\),因为这样会算重,考虑将会算重的部分给去掉。
具体来说,发现如果满足 \(d | \gcd(a_i, a_j)\),那么 \(x | d \to x | \gcd(a_i, a_j)\),也就是说 \(d\) 会在其所有因数再算一次。直接容斥有点麻烦,所以考虑直接在 \(but\) 上进行修改,也就是说进行 \(z | d, but_z \leftarrow but_z - but_d\) 的操作。
注意需要还原 \(but\)
于是就不需要容斥了……接着分析复杂度。
枚举因数同上,是 \(O(128n)\) 的,然而我们多了一个修改桶的操作,发现与枚举所有数的因数的复杂度是类同的,所以是 \(O(m \log m)\) 的。
怎么感觉复杂度假了?
总复杂度就是 \(O(128n + m \log m + n \log n)\),差不多。
总结
我首先想到的就是第一种做法……QwQ,数学学多了,但是仍然想了比较长的时间,基础还是不太牢。
第二种做法相对来说要亲民一些,但是比较难拓展到其他题上,也没法析出新的模型(因为完全可以被第一种方法取代),所以说第二种方法惜败。
最后再回顾一下莫反的 \(5\) 个经典套路:
- \([x = 1] = \sum_{d | x} \mu(d)\)
- \(x = \sum_{d | x} \varphi(d)\)
- 整除分块
- 枚举 \(\gcd\)
- 枚举 \(T = kd\)
CF1900D - Small GCD 题解的更多相关文章
- HDU5726:GCD——题解
题目:hdu的5726 (我原博客的东西,正好整理过来,属于st表裸题) (可以看出我当时有多么的菜--) 这道题写了一遍,然而蒟蒻的我的时间爆炸了-- 于是看了一下学长的代码(顺便在此处%一下学长) ...
- 洛谷 P2568 GCD 题解
原题链接 庆祝一下:数论紫题达成成就! 第一道数论紫题.写个题解庆祝一下吧. 简要题意:求 \[\sum_{i=1}^n \sum_{j=1}^n [gcd(i,j)==p] \] 其中 \(p\) ...
- BZOJ2820:YY的GCD——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2820 Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x& ...
- CC DGCD:Dynamic GCD——题解
https://vjudge.net/problem/CodeChef-DGCD https://www.codechef.com/problems/DGCD 题目大意: 给一颗带点权的树,两个操作: ...
- CH 4302 Interval GCD 题解
题意 给定一个长度为N的数列A,以及M条指令 (N≤5* 10^5, M<=10^5),每条指令可能是以下两种之一: "C l r d",表示把 A[l],A[l+1],-, ...
- gcd 题解
gcd Little White learned the greatest common divisor, so she plan to solve a problem: given \(x, n,\ ...
- [洛谷2257]YY的GCD 题解
整理题目转化为数学语言 题目要我们求: \[\sum_{i=1}^n\sum_{i=1}^m[gcd(i,j)=p]\] 其中 \[p\in\text{质数集合}\] 这样表示显然不是很好,所以我们需 ...
- 洛谷 P2257 YY的GCD 题解
原题链接 庆祝: 数论紫题 \(T4\) 达成! 莫比乌斯 \(T1\) 达成! yy 真是个 神犇 前记 之前我觉得: 推式子,直接欧拉筛,筛出个 \(\phi\),然后乱推 \(\gcd\) 就行 ...
- ABC136 E - Max GCD 题解
题面 给定一个长度为 $N$ 的整数序列:$A_1, A_2, \ldots, A_n$. 您可以执行以下操作 $0 \sim K$ 次: 选择两个整数 $i$ 和 $j$,满足 $i \ne j$ ...
- Codeforces Round #271 (Div. 2)题解【ABCDEF】
Codeforces Round #271 (Div. 2) A - Keyboard 题意 给你一个字符串,问你这个字符串在键盘的位置往左边挪一位,或者往右边挪一位字符,这个字符串是什么样子 题解 ...
随机推荐
- 使用python获取知乎**话题下的所有回答,并统计后发布。
第一步:获取话题需要的url需要,并向上取整 for idx in range(0,math.ceil(totals/5)): url = f"https://www.zhihu.com/a ...
- 中国大陆地区维护的Linux操作系统
Linux开源生态丰富,中国大陆地区基于CentOS停服,依托阿里云.腾讯云.华为云三大私营企业,相继发布了自己的开源Linux定制版,很高兴的是他们只是改个名字并没有选择闭门造车,只是官网还是很不耻 ...
- python格式化时间报错:UnicodeEncodeError: 'locale' codec can't encode character '\u5e74' in position 2: Illegal byte sequence
执行下列代码: from datetime import datetime t = datetime.now() print(t) print(t.strftime("%Y年%m月%d日,% ...
- HarmonyOS NEXT应用开发之预加载so并读取RawFile文件
介绍 本示例主要介绍在TaskPool子线程中使用 dlopen 预加载 so 库并使用句柄调用库函数的方法,以及在Native中使用 pread 系统函数读取Rawfile文件的部分文本内容,并添加 ...
- 针对数据库连接池到DRDS连接探活的优化
简介: 针对数据库连接池到DRDS连接探活的优化 1. 问题背景 近期在给某专有云客户进⾏云产品应⽤性能优化分析时,发现了⼀个有趣的关于DRDS使⽤层⾯的问题,这⾥给⼤家分享⼀下.使⽤过DRDS产品的 ...
- Alibaba Cloud Toolkit 中SLS插件助力线上服务问题排查
简介:Alibaba Cloud Toolkit 是一款非常优秀的插件,新增SLS日志服务的功能,针对软件开发者日常工作中常见的问题排查场景,将日志服务平台的功能集成到ide当中,省去了不同窗口之间 ...
- dotnet 6 使用 HttpWebRequest 进行 POST 文件将占用大量内存
我有用户给我报告一个内存不足的问题,经过了调查,找到了依然是使用已经被标记过时的 HttpWebRequest 进行文件推送,推送过程中,由于 System.Net.RequestStream 将会完 ...
- 服务端向客户端发送消息Server-Sent Events
今天听说了服务端向客户端发消息的一种方式:Server-Sent Events SSE使用的是HTTP协议,本质上是服务端向客户端发送流式数据. HTTP不支持服务端向客户端发送请求,但是如果客户端向 ...
- docker-compose 安装 mysql:5.7.31
目录 一.新建一个启动服务的目录 二.新建文件docker-compose.yml 三.新建角本文件 init-mysql.sh 四.实使化目录和配置文件 启动服务 登陆mysql 其它操作 参考文档 ...
- 欧几里得算法求最大公因数gcd原理证明
要证明欧几里得算法原理,首先需要证明下面两个定理(其中a,b都是整数): 1 如果c可以整除a,同时c也可以整除b,那么c就可以整除au + bv(u,v是任意的整数). 这个定理的证明很简单,$\f ...