原题链接

享受推式子的乐趣吧

数论真有趣!

庆祝:数论紫题第 \(3\) 道。

\[\sum_{i=1}^n \operatorname{lcm}(i,n)
\]

\[= \sum_{i=1}^n \frac{i \times n}{\gcd(i,n)}
\]

\[= n \times \sum_{i=1}^n \frac{i}{\gcd(i,n)}
\]

\[= n \times \sum_{d|n} \sum_{i=1}^n \frac{i}{d} [\gcd(i,n) == d]
\]

\[= n \times \sum_{d|n} \sum_{i=1}^{\frac{n}{d}} i [\gcd(i,\frac{n}{d}) == 1]
\]

\[= n \times \sum_{d|n} \sum_{i=1}^d i [\gcd(i,d)==1]
\]

(注:由于 \(d\) 是枚举因数,因数成对出现,所以 \(\frac{n}{d}\) 等同于 \(d\)).

\[= n \times \sum_{d|n} \frac{d}{2} \phi_d
\]

感觉,数论上大部分是 gcd,然后就是欧拉筛

欧拉筛 日常一下,然后可以提前计算答案。(类似于打表?)

时间复杂度: \(O(n \times d)\). (\(d\) 的值之后解释)

空间复杂度: \(O(n)\).

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const int N1=1e6+1;
const int N=1e6; inline ll read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
ll x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;} int T; ll ans[N1];
ll n,f=0;
ll phi[N1],prime[N1]; inline void Euler() {
phi[1]=1;
for(int i=2;i<=N;i++) {
if(!phi[i]) prime[++f]=i,phi[i]=i-1;
for(int j=1;j<=f && i*prime[j]<=N;j++) {
if(i%prime[j]==0) {
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
} //欧拉筛模板 int main(){
T=read(); Euler();
for(int i=1;i<=N;i++)
for(int j=i;j<=N;j+=i) ans[j]+=phi[j/i]*(j/i)+1>>1;
while(T--) {
n=read();
printf("%lld\n",n*ans[n]);
}
return 0;
}

下面分析一下时间复杂度。

你会发现,除了这一段:

for(int i=1;i<=N;i++)
for(int j=i;j<=N;j+=i) ans[j]+=phi[j/i]*(j/i)+1>>1;

较难计算时间,其余都是 \(O(n)\).

那么这一段的时间,我们再来推个式子:

\[= \sum_{i=1}^n \frac{n}{i}
\]

\[= n \times (\sum_{i=1}^n \frac{1}{i})
\]

这时,你可能想到了 欧拉调和级数 ,但这里 \(n\) 是有限的。

式子推不下去,我们就打了个暴力。

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std; inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;} int main(){
double x=0;
for(int i=1;i<=1000000;i++) x+=1.0/i;
cout<<x;
return 0;
}

最终结果: \(14.3927\)

那么,这可以认为是较小的一个常数(因为它不会影响程序通过本题)。

所以,最终的时间复杂度为: \(O(n)\).

实际得分: \(100pts\).

洛谷 P1891 疯狂LCM 题解的更多相关文章

  1. 题解:洛谷P1891 疯狂LCM

    原题链接 题目描述 描述: 众所周知,czmppppp是数学大神犇.一天,他给众蒟蒻们出了一道数论题,蒟蒻们都惊呆了... 给定正整数N,求LCM(1,N)+LCM(2,N)+...+LCM(N,N) ...

  2. 洛谷 - P1891 - 疯狂LCM - 线性筛

    另一道数据范围不一样的题:https://www.cnblogs.com/Yinku/p/10987912.html $F(n)=\sum\limits_{i=1}^{n} lcm(i,n) $ $\ ...

  3. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

  4. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  5. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

  6. 洛谷P1577 切绳子题解

    洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...

  7. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  8. 洛谷 P1220 关路灯 题解

    Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...

  9. 动态规划 洛谷P1616 疯狂的采药

    动态规划 洛谷P1616 疯狂的采药 同样也是洛谷的动态规划一个普及-的题目,接下来分享一下我做题代码 看到题目,没很认真的看数据大小,我就提交了我的代码: 1 //动态规划 洛谷P1616 疯狂的采 ...

随机推荐

  1. nGrinder 介绍与安装

    nGrinder是基于Grinder开源项目,但由NHN公司的nGrinder开发团队进行了重新设计和完善(所以叫做nGrinder). 它是由一个controller和连接它的多个agent组成,用 ...

  2. Pygame相关

    pygame是主要构筑在SDL库基础上的一组Python模块的集合,它使我们能够用Python语言来创建功能完整的游戏和多媒体程序.pygame是高度括平台可移植的,在任何SDL支持的平台上都可以运行 ...

  3. iOS 客户端与服务端做时间同步

    需求 我们做客户端的时候,有时会需要对客户端与服务器的时间进行同步,比如抢购活动.倒计时等.这时我们要考虑如何准备地与服务器的时间进行同步,同时防止用户本地的时间有误差时导致的问题. 分析 描述 为了 ...

  4. 这有一管信息量很大的DNA

    题图:华盛顿大学副教授Luis Henrique Ceze(照片中的男士)和研究科学家Lee Organick正将数字数据保存进DNA测序,以供"读取"并追溯原始文件. 来自微软和 ...

  5. Spring Boot2.x 动态数据源配置

    原文链接: Spring Boot2.x 动态数据源配置 基于 Spring Boot 2.x.Spring Data JPA.druid.mysql 的动态数据源配置Demo,适合用于数据库的读写分 ...

  6. TypeScript声明文件

    为什么需要声明? 声明的本质是告知编译器一个标识符的类型信息.同时,在使用第三方库时,我们需要引用它的声明文件,才能获得对应的代码补全.接口提示等功能. 声明在TypeScript中至关重要,只有通过 ...

  7. Java入门教程三(流程控制)

    概述 程序有 3 种结构:顺序结构.选择结构和循环结构.分别为:if elseswitch case,while与do while,for, foreach,return,break ,continu ...

  8. Harbor镜像漏洞扫描

    Harbor镜像漏洞扫描 闲聊:我们知道 镜像安全也是容器化建设中一个很重要的环节,像一些商业软件如:Aqua就很专业但是收费也是很昂贵的,今天我们介绍下Harbor自带的镜像扫描器. 一.安装最新版 ...

  9. 从0开发3D引擎(十二):使用领域驱动设计,从最小3D程序中提炼引擎(第三部分)

    目录 上一篇博文 继续实现 实现"DirectorJsAPI.init" 实现"保存WebGL上下文"限界上下文 实现"初始化所有Shader&quo ...

  10. 使用 EOLINKER 进行接口测试的最佳路径 (上)

    本文内容: 测试脚本管理:讲述如何在 EOLINKER 上设计测试项目目录结构. 编写测试脚本:讲述如何在 EOLINKER 上编写接口测试脚本. 测试脚本执行及报告:讲述如何在 EOLINKER 上 ...