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. 基于 EMR OLAP 的开源实时数仓解决方案之 ClickHouse 事务实现

    ​简介:阿里云 EMR OLAP 与 Flink 团队深度合作,支持了 Flink 到 ClickHouse 的 Exactly-Once写入来保证整个实时数仓数据的准确性.本文介绍了基于 EMR O ...

  2. 深入解析 Dubbo 3.0 服务端暴露全流程

    ​简介: 随着云原生时代的到来,Dubbo 3.0 的一个很重要的目标就是全面拥抱云原生.正因如此,Dubbo 3.0 为了能够更好的适配云原生,将原来的接口级服务发现机制演进为应用级服务发现机制. ...

  3. dotnet 修复 Uno 中文乱码

    这是一个历史问题,在使用 Uno 展示中文的时候,如果设置 Uno 的底层使用 Skia 系进行渲染,那么将会因为中文字体问题,导致渲染出现乱码.此问题已被我修复,最佳解法是更新到最新版本 在上一篇博 ...

  4. 迁移 dotnet 6 提示必须将目标平台设置为 Windows 平台

    我在迁移一个古老的项目为 .NET 6 框架,但是 VS 提示 error NETSDK1136 如果使用 Windows 窗体或 WPF,或者引用使用 Windows 窗体或 WPF 的项目或包,则 ...

  5. Taurus.MVC 微服务框架 入门开发教程:项目集成:7、微服务间的调用方式(调整):引用程序集及代码下载(新增)

    前言: 今天补充一下 Taurus.MVC 微服务教程,介绍一下微服务中针对RPC方面调整或新增的功能. 之前系列文章目录: Taurus.MVC 微服务框架 入门开发教程:项目集成:1.服务端:注册 ...

  6. 理解FPGA内部的同步信号、异步信号和亚稳态

    FPGA(Field-Programmable Gate Array),即现场可编程门阵列.主要是利用内部的可编程逻辑实现设计者想要的功能.FPGA属于数字逻辑芯片,其中也有可能会集成一部分模拟电路的 ...

  7. 有意思!一个关于 Spring 历史的在线小游戏

    发现 Spring One 的官网上有个好玩的彩蛋,分享给大家! 进到Spring One的官网,可以看到右下角有个类似马里奥游戏中的金币图标. 点击该金币之后,会打开一个新的页面,进入下面这样一个名 ...

  8. 表和数据连接,而不是和表连接(JOIN)

    1.连接数据,但是顺序会受影响 在使用JOIN连接临时表或子查询时,无法保证结果的顺序与特定值的顺序完全一致.这是因为在查询过程中,数据库优化器可能会选择不同的执行计划,导致结果的顺序发生变化. SE ...

  9. 2021~2022Apache大数据相关项目盘点

    一.晋升为Apache TLP(Top-Level Project)的大数据相关项目 1.1.Apache DataSketches (20210203) 1.2.Apache Gobblin (20 ...

  10. cesium教程5-用primitive加载glb和gltf格式的小模型

    primitive加载方法更底层,用起来更麻烦,但是效率更高. 完整示例代码: <!DOCTYPE html> <html lang="en"> <h ...