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 题意 给你一个字符串,问你这个字符串在键盘的位置往左边挪一位,或者往右边挪一位字符,这个字符串是什么样子 题解 ...
随机推荐
- js获取时间差,返回格式为01天02小时03秒
// 获取时间差 返回值格式:01天02小时30秒 export function caclulateDiffTime(start, end): string { start = new Date(s ...
- vscode下的超级慢的解决方法
vscode下的超级慢的解决方法 从网上看到的方法,记录给自己看 vscode官网:https://code.visualstudio.com/Download 复制下载链接 链接如下: https: ...
- 力扣319(java)-灯泡开关(中等)
题目: 初始时有 n 个灯泡处于关闭状态.第一轮,你将会打开所有灯泡.接下来的第二轮,你将会每两个灯泡关闭第二个. 第三轮,你每三个灯泡就切换第三个灯泡的开关(即,打开变关闭,关闭变打开).第 i 轮 ...
- HarmonyOS NEXT应用开发实战—组件堆叠
介绍 本示例介绍运用Stack组件以构建多层次堆叠的视觉效果.通过绑定Scroll组件的onScroll滚动事件回调函数,精准捕获滚动动作的发生.当滚动时,实时地调节组件的透明度.高度等属性,从而成功 ...
- 社区首款 OAM 可视化平台发布!
作者 | 徐运元,杭州谐云科技合伙人及资深架构师,云计算行业和 Kubernetes 生态资深从业者 导读:什么是 OAM?2019 年 10 月 17 日,阿里巴巴合伙人.阿里云智能基础产品事业部总 ...
- Let's Fluent:更顺滑的MyBatis
简介: 只需瞅一眼Google Trends上全球Java界最热门的两款SQL映射框架近一年的对比数字,就不难了解其实力分布:在此领域,MyBatis早已占领东亚地区开发者市场,并以绝对优势稳居中国最 ...
- 2019-8-31-C#-转换类型和字符串
title author date CreateTime categories C# 转换类型和字符串 lindexi 2019-08-31 16:55:58 +0800 2018-2-13 17:2 ...
- Swift File Manager 三种文件路径查找方法对比
目录 1. 引言 2. 三种文件路径查找方法 2. 1 NSSearchPathForDirectoriesInDomains(_:_:_:) 2.2 urls(for:in:) 2.3 url(fo ...
- scp本地服务器和远程服务器拷贝文件
上传本地文件到服务器 scp 本地路径 用户名@远程服务器ip:远程路径 下载文件 scp 用户名@远程服务器ip:远程路径 本地路径 -r 是上传下载本地目录到远程 远程文件
- Javascript返回顶部和砸金蛋,跑马灯等游戏代码实现
1. 我们经常写页面的时候会遇到页面很长需要做返回顶部的操作:$("id /class").animate({scrollTop:$('.class').offset().top} ...