题目链接

https://www.51nod.com/Challenge/Problem.html#!#problemId=1238

题解

本来想做个杜教筛板子题结果用另一种方法过了......

所谓的“另一种方法”用到的一些技巧还是挺不错的,因此这里简单介绍一下。

首先还是基本的推式子:

\[\begin{aligned}\sum_{i = 1}^n \sum_{j = 1}^n {\rm lcm}(i, j) &= \sum_{i = 1}^n \sum_{j = 1}^n \frac{ij}{{\rm gcd}(i, j)} \\ &= \sum_{d = 1}^{n} \sum_{i = 1}^n \sum_{j = 1}^n[{\rm gcd}(i, j) = d]\frac{ij}{d} \\ &= \sum_{d = 1}^n d\sum_{i = 1}^{\left\lfloor\frac{n}{d}\right\rfloor}\sum_{j = 1}^{\left\lfloor\frac{n}{d}\right\rfloor}[{\rm gcd}(i, j) = 1]ij\end{aligned}\]

设 \(f(x) = \sum_\limits{i = 1}^x \sum_\limits{j = 1}^x [{\rm gcd}(i, j) = 1]ij\),那么答案即为 \(\sum_\limits{d = 1}^n d\times f(\left\lfloor\frac{n}{d}\right\rfloor)\)。显然答案可以数论分块求,因此我们的任务就是求 \(f\) 函数。

首先考虑当 \(x\) 较小时,我们能否直接预处理出 \(f(x)\)。考虑差分:当 \(x > 1\) 时,\(f(x)\) 较 \(f(x - 1)\) 而言,多了的部分为:\[\left(\sum_\limits{i = 1}^x\sum_\limits{j = 1}^x [{\rm gcd}(i, j) = 1]ij\right) - \left(\sum_\limits{i = 1}^{x - 1}\sum_\limits{j = 1}^{x - 1} [{\rm gcd}(i, j) = 1]ij\right) = 2x \sum_{i = 1}^x [{\rm gcd}(i, x) = 1]i\]

而由于小于等于 \(x(x > 1)\) 且与 \(x\) 互质的数的和为 \(\frac{\varphi(x)x}{2}\)(证明提示:当 \(n \geq 2\) 时,若 \({\rm gcd}(d, n) = 1\) 必然有 \({\rm gcd}(n - d, n) = 1\),与 \(n\) 互质的 \(d\) 共有 \(\varphi(n)\) 个),因此我们就得到了 \(f(x)\) 的递推式:\(f(x) = f(x - 1) + 2x \times \frac{\varphi(x)x}{2}\),即 \(f(x) = f(x - 1) + \varphi(x)x^2\)。

不过这只能处理 \(x\) 较小的情况。当 \(x\) 较大时,我们仍然得另谋他路。在 \(f(x) = \sum_\limits{i = 1}^x \sum_\limits{j = 1}^x [{\rm gcd}(i, j) = 1]ij\) 当中,对 \(f(x)\) 有贡献的 \(i, j\) 满足 \(i\) 与 \(j\) 是互质的,我们尝试着使用补集转化,用总和减去不互质的 \(i, j\) 的贡献:

\[\begin{aligned} f(x) &= \sum_{i = 1}^x\sum_{j = 1}^x ij - \sum_{d = 2}^x \sum_{i = 1}^x \sum_{j = 1}^x [{\rm gcd}(i, j) = d]ij \\ &= \left(\frac{x(x+1)}{2}\right)^2 - \sum_{d = 2}^x d^2 \sum_{i = 1}^{\left\lfloor\frac{x}{d}\right\rfloor} \sum_{j = 1}^{\left\lfloor\frac{x}{d}\right\rfloor} [{\rm gcd}(i, j) = 1]ij \\ &=\left(\frac{x(x+1)}{2}\right)^2 - \sum_{d = 2}^x d^2 f(\left\lfloor\frac{x}{d}\right\rfloor) \end{aligned}\]

这样,我们就能够递归地去求解当 \(x\) 较大时 \(f(x)\) 的值了。不难发现,该求解方法的时间复杂度和杜教筛是一样的,为 \(O(n^{\frac{2}{3}})\),且非常好写。

代码

#include<bits/stdc++.h>using namespace std;const int mod = 1000000007, inv2 = 500000004, inv6 = 166666668, up = 4641589, md = 1000003;int main() {function<int (int, int)> mul = [&] (int x, int y) {return (long long) x * y % mod;};function<void (int&, int)> add = [&] (int& x, int y) {x += y;if (x >= mod) {x -= mod;}};function<void (int&, int)> sub = [&] (int& x, int y) {x -= y;if (x < 0) {x += mod;}};vector<bool> is_prime(up, true);vector<int> phi(up), primes;phi[1] = 1;for (int i = 2; i < up; ++i) {if (is_prime[i]) {primes.push_back(i);phi[i] = i - 1;}for (auto v : primes) {int d = v * i;if (d >= up) {break;}is_prime[d] = false;if (i % v == 0) {phi[d] = mul(phi[i], v);break;} else {phi[d] = mul(phi[i], phi[v]);}}}for (int i = 2; i < up; ++i) {phi[i] = mul(mul(phi[i], i), i);add(phi[i], phi[i - 1]);}function<int (long long)> sum_pow2 = [&] (long long n) {n %= mod;return mul(mul(mul(n, n + 1), (n * 2 + 1)), inv6);};vector<pair<long long, int>> value[md];function<int (long long)> find = [&] (long long v) {int p = v % md;for (auto e : value[p]) {if (e.first == v) {return e.second;}}return -1;};function<void (long long, int)> insert = [&] (long long v, int result) {value[v % md].emplace_back(v, result);};function<int (long long)> f = [&] (long long n) {int returned = find(n);if (~returned) {return returned;} else {if (n < up) {return phi[n];} else {int result = 0, x = n % mod;x = mul(mul(x, x + 1), inv2);result = mul(x, x);for (long long i = 2, last; i <= n; i = last + 1) {last = n / (n / i);sub(result, mul((sum_pow2(last) - sum_pow2(i - 1) + mod) % mod, f(n / i)));}insert(n, result);return result;}}};long long n;scanf("%lld", &n);int answer = 0;for (long long i = 1, last; i <= n; i = last + 1) {last = n / (n / i);add(answer, mul(mul(mul((i + last) % mod, (last - i + 1) % mod), inv2), f(n / i)));}printf("%d\n", answer);return 0;
}

转载于:https://www.cnblogs.com/ImagineC/p/10121395.html

51nod1238. 最小公倍数之和 V3(数论)相关推荐

  1. [51nod1238] 最小公倍数之和 V3(杜教筛)

    题面 传送门 题解 懒了--这里写得挺好的-- //minamoto #include<bits/stdc++.h> #define R register #define ll long ...

  2. 51nod1238 最小公倍数之和 V3

    又被这神仙题给坑爆了. 神仙题解. 一开始我把lcm变成ij/gcd然后按照常规套路去推,推到最后发现不是miu * Id而是miu · Id......这还搞鬼啊. 正解居然跟这个差不多,先转成求其 ...

  3. [51 nod 1238] 最小公倍数之和 V3(杜教筛)

    1238 最小公倍数之和 V3 推式子 ∑i=1n∑j=1nlcm(i,j)=∑i=1n∑j=1nijgcd(i,j)=∑d=1n∑i=1n∑j=1nijd(gcd(i,j)==d)=∑d=1nd∑i ...

  4. 51 NOD 1238 最小公倍数之和 V3

    原题链接 最近被51NOD的数论题各种刷--(NOI快到了我在干什么啊! 然后发现这题在网上找不到题解--那么既然A了就来骗一波访问量吧-- (然而并不怎么会用什么公式编辑器,写得丑也凑合着看吧-- ...

  5. 51nod 1238 最小公倍数之和 V3

    背景: luogu P1829 \text{luogu P1829 }luogu P1829 [国家集训队]Crash的数字表格 / JZPTAB的加强版. 题目传送门: http://www.51n ...

  6. C语言易错题--求最大公约数与最小公倍数之和(辗转相除法)

    题目来源:牛客网编程入门训练--BC115  小乐乐与欧几里得 输入描述: 每组输入包含两个正整数n和m.(1 ≤ n ≤ 109,1 ≤ m ≤ 109) 输出描述: 对于每组输入,输出一个正整数, ...

  7. 1190 最小公倍数之和 V2

    1190 最小公倍数之和 V2 ∑i=ablcm(i,b)∑i=abi×bgcd⁡(i,b)b∑d∣b∑i=⌈ad⌉bdi[gcd(i,bd)=1]b∑d∣b∑k∣bdμ(k)k∑i=⌈⌈ad⌉k⌉a ...

  8. P3911 最小公倍数之和 (atcoder C - LCMs)(反演)

    P3911 最小公倍数之和 推式子 ∑i=1n∑j=1nlcm(ai,aj)下面的n=max(ai),ci为i在原数组中出现的次数∑i=1n∑j=1nijgcd(ij)cicj=∑d=1n1d∑i=1 ...

  9. 51 NOD 1363 最小公倍数之和 (欧拉函数思维应用)

    1363 最小公倍数之和 推式子 ∑i=1nlcm(i,n)=n∑i=1nigcd(i,n)=n∑d∣n∑i=1nid(gcd(i,n)==d)=n∑d∣n∑i=1ndi(gcd(i,nd)==1)= ...

最新文章

  1. linux shell bash 内置变量参考
  2. python使用符号#表示单行注释-Pyhton中单行和多行注释的使用方法及规范
  3. linux某个目录环境变量,在linux下加环境变量或者是把某个目录加到环境变量
  4. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1082:求小数的某一位
  5. Bound Services
  6. RelationTrack解读
  7. 自动生成三层结构代码(3)--生成数据访问层Insert方法
  8. Unicode和Utf-8
  9. Android的引用jar包
  10. 迷宫问题,手动模拟栈
  11. 西瓜书《贝叶斯》朴素贝叶斯公式推导
  12. lua的元表、模块和面向对象
  13. ceph集群报错:HEALTH_ERR 1 pgs inconsistent; 1 scrub errors
  14. wr703n 4m固件 带打印机服务器_旗捷支招 | 如何关闭打印机固件自动更新?分分钟搞定!...
  15. 中国石油大学c语言程序设计答案,中国石油大学《C语言程序设计》期末复习题和答案.doc...
  16. 矩阵分析与应用(一)
  17. Chrome 咕咕牛懒器(guge niú lǎn qì) 安装 及助手插件操作
  18. 高旭东:科普返利网站模式,做到知己知彼放心购物!
  19. plink软件初体验3--计算样本杂合度和SNP位点杂合度
  20. HTML语言源代码实例

热门文章

  1. 2017 码云最火开源项目 TOP 50,你用过哪些?
  2. Python生成器实现及yield关键字
  3. textbox有个AutoCompleteType的属性
  4. 【opencv学习】透视变换矩阵
  5. PRML-系列一之1.2.5~1.2.6
  6. 去哪儿-06-home-ajax
  7. a除b的余数【取模(%)与取余(/)的区别】
  8. ubuntu 修该rm命令使删除文件到回收站
  9. 苹果电脑 不能使用服务器发送邮件,解决Mac上无法使用的邮件问题的技术
  10. Spring集成单元测试