Luogu2398 GCD SUM
求 \(\displaystyle\sum_{i=1}^n\sum_{j=1}^n\gcd(i,j)\)
\(n\leq10^5\)
数论
先常规化式子(大雾
\]
似乎原问题就转化为了快速求 \(\displaystyle{\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}}\sum_{j=1}^{\lfloor\frac{n}{k}\rfloor}{[\gcd(i,j)=1]}\)
是不是有点 似曾相识
容易发现上式可以用 \(\varphi\) 替代,即 \(2\displaystyle\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\varphi(i)-1\)
因此原式即为 $$\displaystyle\sum_{k=1}n{k (2\displaystyle\sum_{i=1}{\lfloor\frac{n}{k}\rfloor}\varphi(i)-1)}$$
时间复杂度 \(O(n)\) ,也可以用数论分块优化到 \(O(\sqrt n)\)
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
int n, tot, p[maxn]; ll phi[maxn];
void sieve() {
phi[1] = 1;
for (int i = 2; i <= n; i++) {
if (!p[i]) p[++tot] = i, phi[i] = i - 1;
for (int j = 1; j <= tot && i * p[j] <= n; j++) {
p[i * p[j]] = 1;
if (i % p[j] == 0) {
phi[i * p[j]] = phi[i] * p[j]; break;
}
phi[i * p[j]] = phi[i] * phi[p[j]];
}
}
for (int i = 1; i <= n; i++) {
phi[i] += phi[i - 1];
}
}
int main() {
scanf("%d", &n), sieve(); ll ans = 0;
for (int i = 1; i <= n; i++) {
ans += i * (phi[n / i] * 2 - 1);
}
printf("%lld", ans);
return 0;
}
Luogu2398 GCD SUM的更多相关文章
- acdream 1148 GCD SUM 莫比乌斯反演 ansx,ansy
GCD SUM Time Limit: 8000/4000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatis ...
- GCD SUM 强大的数论,容斥定理
GCD SUM Time Limit: 8000/4000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitStatu ...
- bnu——GCD SUM (莫比乌斯反演)
题目:GCD SUM 题目链接:http://www.bnuoj.com/v3/problem_show.php?pid=39872 算法:莫比乌斯反演.优化 #include<stdio.h& ...
- 洛谷P2398 GCD SUM [数论,欧拉筛]
题目传送门 GCD SUM 题目描述 for i=1 to n for j=1 to n sum+=gcd(i,j) 给出n求sum. gcd(x,y)表示x,y的最大公约数. 输入输出格式 输入格式 ...
- P2398 GCD SUM
P2398 GCD SUM一开始是憨打表,后来发现打多了,超过代码长度了.缩小之后是30分,和暴力一样.正解是,用f[k]表示gcd为k的一共有多少对.ans=sigma k(1->n) k*f ...
- 洛谷P2398 GCD SUM (数学)
洛谷P2398 GCD SUM 题目描述 for i=1 to n for j=1 to n sum+=gcd(i,j) 给出n求sum. gcd(x,y)表示x,y的最大公约数. 输入输出格式 输入 ...
- GCD SUM
GCD SUM 求 \[\sum_{i=1}^n\sum_{j=1}^n\gcd(i,j) \] 将原式变换得到 \[\sum_{d=1}^nd\sum_{i=1}^{\lfloor\frac{n}{ ...
- LuoguP2398 GCD SUM
题目地址 题目链接 题目描述 for i=1 to n for j=1 to n sum+=gcd(i,j) 给出n求sum. gcd(x,y)表示x,y的最大公约数. 输入输出格式 输入格式: n ...
- 洛谷P2398 GCD SUM
题目描述 for i=1 to n for j=1 to n sum+=gcd(i,j) 给出n求sum. gcd(x,y)表示x,y的最大公约数. 输入输出格式 输入格式: n 输出格式: sum ...
随机推荐
- js 常用正则表达式
1 用户名正则 //用户名正则,4到16位(字母,数字,下划线,减号) var uPattern = /^[a-zA-Z0-9_-]{4,16}$/; //输出 true console.log(uP ...
- css:Media Queries: How to target desktop, tablet and mobile?
<!doctype html> <html> <head> <meta name="viewport" content="wid ...
- file上传图片,base64转换、压缩图片、预览图片、将图片旋转到正确的角度
/** * 将base64转换为文件对象 * (即用文件上传输入框上传文件得到的对象) * @param {String} base64 base64字符串 */ function convertBa ...
- 2018-10-31 在线代码离线翻译Chrome插件"一马"v0.0.8
续前文: Chrome插件实现GitHub代码离线翻译v0.0.4 添加了对"码云"在线代码的翻译支持, 因此改名暂为"一马". 在此贴中调研了常用的在线代码网 ...
- 【代码笔记】Web-JavaScript-JavaScript调试
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- ICML 2018 | 从强化学习到生成模型:40篇值得一读的论文
https://blog.csdn.net/y80gDg1/article/details/81463731 感谢阅读腾讯AI Lab微信号第34篇文章.当地时间 7 月 10-15 日,第 35 届 ...
- Ubuntu添加新分区
1.查看分区 ~$ sudo fdisk -l 2.添加分区 ~$ fdisk /dev/sda 3.输入m查看帮助 ~$ m 4.输入n新建分区,即添加分区 ~$ n 这里会出现设置分区大小 5.输 ...
- c++屏蔽Win10系统快捷键
很久之前实现的功能,也是参考其他人的实现,时间太久,具体参考哪里已经记不得了. 这里不仅能屏蔽一般的快捷键,还可以屏蔽ctrl+atl+del. ; HHOOK keyHook = NULL; HHO ...
- 微信小程序中的循环遍历问题
比如:如果在微信小程序中要遍历输出 0-9 的数,我们会使用for循环 ;i<;i++){ console.log(i); } 确实结果也是这样: 但是,如果我在循环时同时调用wx的api接口1 ...
- Linux日志出现大量"kernel: NET: Registered protocol family 36"
一台Linux服务器的系统错误日志出现大量的" kernel: NET: Registered protocol family 36"错误信息,如下所示: Jul 2 05:27 ...