1900D - Small GCD

给定序列 \(A\),定义 \(f(a, b, c)\) 为 \(a, b, c\) 中最小的次小的数的 \(\gcd\),求:

\[\sum_{i = 1}^n \sum_{j = i + 1}^n \sum_{k = j + 1}^n f(a_i, a_j, a_k)
\]

题解

目前来说有两种方法,都十分有启发意义,但是有共同的开头。

考虑到 \(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_{i = 1}^n \sum_{j = i + 1}^n \gcd(a_i, a_j) \times (n - j)
\]

接下来衍生出了两种做法。

莫比乌斯反演

准确来说应该是欧拉反演?

注意到:

\[\sum_{d | x} \varphi(d) = x
\]

那么我们可以将目标表达式写为:

\[\sum_{i = 1}^n \sum_{j = i + 1}^n \sum_{d | a_i, a_j} \varphi(d) \times (n - j)
\]

交换求和顺序,可以得到:

\[\begin{aligned}
& \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)\)。

另类的枚举

回到基础的式子:

\[\sum_{i = 1}^n \sum_{j = i + 1}^n \gcd(a_i, a_j) \times (n - j)
\]

如果我们固定 \(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 题解的更多相关文章

  1. HDU5726:GCD——题解

    题目:hdu的5726 (我原博客的东西,正好整理过来,属于st表裸题) (可以看出我当时有多么的菜--) 这道题写了一遍,然而蒟蒻的我的时间爆炸了-- 于是看了一下学长的代码(顺便在此处%一下学长) ...

  2. 洛谷 P2568 GCD 题解

    原题链接 庆祝一下:数论紫题达成成就! 第一道数论紫题.写个题解庆祝一下吧. 简要题意:求 \[\sum_{i=1}^n \sum_{j=1}^n [gcd(i,j)==p] \] 其中 \(p\) ...

  3. BZOJ2820:YY的GCD——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2820 Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x& ...

  4. CC DGCD:Dynamic GCD——题解

    https://vjudge.net/problem/CodeChef-DGCD https://www.codechef.com/problems/DGCD 题目大意: 给一颗带点权的树,两个操作: ...

  5. CH 4302 Interval GCD 题解

    题意 给定一个长度为N的数列A,以及M条指令 (N≤5* 10^5, M<=10^5),每条指令可能是以下两种之一: "C l r d",表示把 A[l],A[l+1],-, ...

  6. gcd 题解

    gcd Little White learned the greatest common divisor, so she plan to solve a problem: given \(x, n,\ ...

  7. [洛谷2257]YY的GCD 题解

    整理题目转化为数学语言 题目要我们求: \[\sum_{i=1}^n\sum_{i=1}^m[gcd(i,j)=p]\] 其中 \[p\in\text{质数集合}\] 这样表示显然不是很好,所以我们需 ...

  8. 洛谷 P2257 YY的GCD 题解

    原题链接 庆祝: 数论紫题 \(T4\) 达成! 莫比乌斯 \(T1\) 达成! yy 真是个 神犇 前记 之前我觉得: 推式子,直接欧拉筛,筛出个 \(\phi\),然后乱推 \(\gcd\) 就行 ...

  9. ABC136 E - Max GCD 题解

    题面 给定一个长度为 $N$ 的整数序列:$A_1, A_2, \ldots, A_n$. 您可以执行以下操作 $0 \sim K$ 次: 选择两个整数 $i$ 和 $j$,满足 $i \ne j$ ...

  10. Codeforces Round #271 (Div. 2)题解【ABCDEF】

    Codeforces Round #271 (Div. 2) A - Keyboard 题意 给你一个字符串,问你这个字符串在键盘的位置往左边挪一位,或者往右边挪一位字符,这个字符串是什么样子 题解 ...

随机推荐

  1. js获取时间差,返回格式为01天02小时03秒

    // 获取时间差 返回值格式:01天02小时30秒 export function caclulateDiffTime(start, end): string { start = new Date(s ...

  2. vscode下的超级慢的解决方法

    vscode下的超级慢的解决方法 从网上看到的方法,记录给自己看 vscode官网:https://code.visualstudio.com/Download 复制下载链接 链接如下: https: ...

  3. 力扣319(java)-灯泡开关(中等)

    题目: 初始时有 n 个灯泡处于关闭状态.第一轮,你将会打开所有灯泡.接下来的第二轮,你将会每两个灯泡关闭第二个. 第三轮,你每三个灯泡就切换第三个灯泡的开关(即,打开变关闭,关闭变打开).第 i 轮 ...

  4. HarmonyOS NEXT应用开发实战—组件堆叠

    介绍 本示例介绍运用Stack组件以构建多层次堆叠的视觉效果.通过绑定Scroll组件的onScroll滚动事件回调函数,精准捕获滚动动作的发生.当滚动时,实时地调节组件的透明度.高度等属性,从而成功 ...

  5. 社区首款 OAM 可视化平台发布!

    作者 | 徐运元,杭州谐云科技合伙人及资深架构师,云计算行业和 Kubernetes 生态资深从业者 导读:什么是 OAM?2019 年 10 月 17 日,阿里巴巴合伙人.阿里云智能基础产品事业部总 ...

  6. Let's Fluent:更顺滑的MyBatis

    简介: 只需瞅一眼Google Trends上全球Java界最热门的两款SQL映射框架近一年的对比数字,就不难了解其实力分布:在此领域,MyBatis早已占领东亚地区开发者市场,并以绝对优势稳居中国最 ...

  7. 2019-8-31-C#-转换类型和字符串

    title author date CreateTime categories C# 转换类型和字符串 lindexi 2019-08-31 16:55:58 +0800 2018-2-13 17:2 ...

  8. Swift File Manager 三种文件路径查找方法对比

    目录 1. 引言 2. 三种文件路径查找方法 2. 1 NSSearchPathForDirectoriesInDomains(_:_:_:) 2.2 urls(for:in:) 2.3 url(fo ...

  9. scp本地服务器和远程服务器拷贝文件

    上传本地文件到服务器 scp 本地路径 用户名@远程服务器ip:远程路径 下载文件 scp 用户名@远程服务器ip:远程路径 本地路径 -r 是上传下载本地目录到远程 远程文件

  10. Javascript返回顶部和砸金蛋,跑马灯等游戏代码实现

    1. 我们经常写页面的时候会遇到页面很长需要做返回顶部的操作:$("id /class").animate({scrollTop:$('.class').offset().top} ...