Solution -「洛谷 P3911」最小公倍数之和
\(\mathcal{Description}\)
Link.
给定 \(\{a_n\}\),求:
\]
\(1\le n,a_i\le5\times10^4\)。
\(\mathcal{Solution}\)
数论题在序列上搞不太现实,记最大值 \(m\),有 \(c_i\) 个 \(a_j=i\),推式子:
\sum_{i=1}^n\sum_{j=1}^n\operatorname{lcm}(a_i,a_j)&=\sum_{i=1}^m\sum_{j=1}^m\frac{ij}{\gcd(i,j)}c_ic_j\\
&=\sum_{d=1}^m\sum_{i=1}^{\lfloor\frac{m}d\rfloor}\sum_{j=1}^{\lfloor\frac{m}d\rfloor}[\gcd(i,j)=1]dijc_ic_j\\
&=\sum_{d=1}^m\sum_{i=1}^{\lfloor\frac{m}d\rfloor}\sum_{j=1}^{\lfloor\frac{m}d\rfloor}dijc_ic_j\sum_{D|i\land D|j}\mu(D)~~~~(\text{Mobius 反演})\\
&=\sum_{d=1}^md\sum_{D=1}^{\lfloor\frac{m}d\rfloor}\mu(D)D^2\sum_{i=1}^{\lfloor\frac{m}{dD}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{dD}\rfloor}ijc_{idD}c_{jdD}~~~~(\text{交换枚举顺序})\\
&=\sum_{T=1}^mT\sum_{D|T}\mu(D)D\sum_{i=1}^{\lfloor\frac{m}T\rfloor}\sum_{j=1}^{\lfloor\frac{m}T\rfloor}ijc_{iT}c_{jT}~~~~(\text{改换枚举}~T=dD)\\
&=\sum_{T=1}^mT\left(\sum_{i=1}^{\lfloor\frac{m}T\rfloor}ic_{iT}\right)^2\sum_{D|T}\mu(D)D
\end{aligned}
\]
\(\mathcal O(n+m\sqrt m)\) 算就好啦。
\(\mathcal{Code}\)
#include <cmath>
#include <cstdio>
const int MAXN = 5e4;
int n, m, c[MAXN + 5];
int pn, pr[MAXN + 5], mu[MAXN + 5];
bool vis[MAXN + 5];
inline int rint () {
int x = 0; char s = getchar ();
for ( ; s < '0' || '9' < s; s = getchar () );
for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
return x;
}
inline void sieve ( const int n ) {
mu[1] = 1;
for ( int i = 2; i <= n; ++ i ) {
if ( !vis[i] ) mu[pr[++ pn] = i] = -1;
for ( int j = 1, t; j <= pn && ( t = i * pr[j] ) <= n; ++ j ) {
vis[t] = true;
if ( !( i % pr[j] ) ) break;
mu[t] = -mu[i];
}
}
}
int main () {
n = rint ();
for ( int i = 1, a; i <= n; ++ i ) {
++ c[a = rint ()];
if ( m < a ) m = a;
}
sieve ( m );
long long ans = 0;
for ( int i = 1; i <= m; ++ i ) {
long long a = 0, b = 0;
for ( int j = 1, t = m / i; j <= t; ++ j ) a += 1ll * j * c[i * j];
for ( int j = 1, t = sqrt ( i ); j <= t; ++ j ) {
if ( i % j ) continue;
b += mu[j] * j;
if ( j * j < i ) b += mu[i / j] * i / j;
}
ans += 1ll * i * a * a * b;
}
printf ( "%lld\n", ans );
return 0;
}
\(\mathcal{Details}\)
推的时候把 \(ij\) 系数搞丢了自闭半天 qaq。
Solution -「洛谷 P3911」最小公倍数之和的更多相关文章
- Solution -「洛谷 P4372」Out of Sorts P
\(\mathcal{Description}\) OurOJ & 洛谷 P4372(几乎一致) 设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...
- Note/Solution -「洛谷 P5158」「模板」多项式快速插值
\(\mathcal{Description}\) Link. 给定 \(n\) 个点 \((x_i,y_i)\),求一个不超过 \(n-1\) 次的多项式 \(f(x)\),使得 \(f(x ...
- Solution -「洛谷 P5236」「模板」静态仙人掌
\(\mathcal{Description}\) Link. 给定一个 \(n\) 个点 \(m\) 条边的仙人掌,\(q\) 组询问两点最短路. \(n,q\le10^4\),\(m\ ...
- Solution -「洛谷 P4198」楼房重建
\(\mathcal{Description}\) Link. 给定点集 \(\{P_n\}\),\(P_i=(i,h_i)\),\(m\) 次修改,每次修改某个 \(h_i\),在每次修改后 ...
- Solution -「洛谷 P6577」「模板」二分图最大权完美匹配
\(\mathcal{Description}\) Link. 给定二分图 \(G=(V=X\cup Y,E)\),\(|X|=|Y|=n\),边 \((u,v)\in E\) 有权 \(w( ...
- Solution -「洛谷 P6021」洪水
\(\mathcal{Description}\) Link. 给定一棵 \(n\) 个点的带点权树,删除 \(u\) 点的代价是该点点权 \(a_u\).\(m\) 次操作: 修改单点点权. ...
- Solution -「洛谷 P4719」「模板」"动态 DP" & 动态树分治
\(\mathcal{Description}\) Link. 给定一棵 \(n\) 个结点的带权树,\(m\) 次单点点权修改,求出每次修改后的带权最大独立集. \(n,m\le10^5 ...
- Solution -「洛谷 P4320」道路相遇
\(\mathcal{Description}\) Link. 给定一个 \(n\) 个点 \(m\) 条边的连通无向图,并给出 \(q\) 个点对 \((u,v)\),询问 \(u\) 到 ...
- Solution -「洛谷 P5827」边双连通图计数
\(\mathcal{Description}\) link. 求包含 \(n\) 个点的边双连通图的个数. \(n\le10^5\). \(\mathcal{Solution}\) ...
随机推荐
- C#进程调用FFmpeg操作音视频
项目背景 因为公司需要对音视频做一些操作,比如说对系统用户的发音和背景视频进行合成,以及对多个音视频之间进行合成,还有就是在指定的源背景音频中按照对应的规则在视频的多少秒钟内插入一段客户发音等一些复杂 ...
- Unity3D开发入门教程(四)——用Lua实现组件
五邑隐侠,本名关健昌,12年游戏生涯. 本教程以 Unity 3D + VS Code + C# + tolua 为例. 一.Lua组件基类 1.在 Assets/Lua 目录下新建com目录用于存放 ...
- 【linux】Ubuntu20.04使用apt下载和卸载openJDK
Ubuntu20.04使用apt下载和卸载openJDK 前言 由于最近电脑装了ubuntu和win双系统,想再ubuntu上学习.在成功配置完系统之后,开始了配学习环境的旅程.... 这次的是使用u ...
- 【记录一个问题】android下的ucontext协程,因为使用栈上的对象,导致cv::Mat被莫名析构
工作的流程是这样:某个协程在栈上创建task对象,在task对象内有需要返回的cv::Mat. 然后把task放到另一个线程上去执行,然后切换到别的协程,等到工作线程执行完task后,再唤醒协程. 这 ...
- visual studio进行机器学习与python编写
visual studio里的python安装之后自带一个虚拟环境 1.anaconda有些包版本无法到最新. 2.包管理器在安装卸载,强制停止后,包管理器会出问题,一直卸不掉那个包. 在卸载pyth ...
- 快速删除IDEA/WebStrom/Rider中的代码空行
使用替换 ^\s*\n 并打开正则匹配模式 Visual Studio中未测试,大家可以去试一试
- Servlet虚拟路径匹配规则
当 Servlet 容器接收到请求后,容器会将请求的 URL 减去当前应用的上下文路径,使用剩余的字符串作为映射 URL 与 Servelt 虚拟路径进行匹配,匹配成功后将请求交给相应的 Servle ...
- 无缓冲文件IO和目录操作
引言 在后台开发中,对于文件I/O我们通常不使用C语言封装的fopen.fread.fwrite标准I/O,而是直接使用Linux提供的系统调用函数.因为这些系统调用没有使用用户缓冲区,我们直接与内核 ...
- lua之自索引
Father={ a=100, b=200 } function Father:dis() print(self.a,self.b) end Father.__index=Father Son= { ...
- listen()和accept()
1.listen()队列剖析 作用:监听端口,TCP连接中的服务器端角色 调用格式:int listen(int sockfd, int backlog); 第一个参数:创建的sockfd, 好好理解 ...