题目描述

求∑i=1N∑j=1Nlcm(i,j)\sum_{i=1}^N\sum_{j=1}^Nlcm(i,j)i=1∑N​j=1∑N​lcm(i,j)

2&lt;=N&lt;=10102&lt;=N&lt;=10^{10}2<=N<=1010

题目分析

这道题题面跟[bzoj 2693] jzptab & [bzoj 2154] Crash的数字表格一样,然而数据范围加强到了101010^{10}1010,莫比乌斯反演不行了了,所以我们看看怎样玄学杜教筛

Ans=∑i=1n∑j=1nlcm(i,j)=2∑i=1n∑j=1ilcm(i,j)−n(n+1)2Let s(n)=∑i=1n∑j=1ilcm(i,j),f(n)=∑i=1nlcm(i,n)∴f(n)=∑i=1nin(i,n)=n∑i=1ni(i,n)=n∑d∣n∑i=1n[(i,n)==d]id=n∑d∣n∑i=1nd[(i,nd)==1]i=n∑d∣n∑i=1d[(i,d)==1]i=n∑d∣nφ(d)d+[d==1]2\large Ans=\sum_{i=1}^n\sum_{j=1}^nlcm(i,j)=2\sum_{i=1}^n\sum_{j=1}^ilcm(i,j)-\frac{n(n+1)}{2}\\Let~s(n)=\sum_{i=1}^n\sum_{j=1}^ilcm(i,j),f(n)=\sum_{i=1}^nlcm(i,n)\\ \therefore f(n)=\sum_{i=1}^n\frac{in}{(i,n)}=n\sum_{i=1}^n\frac i{(i,n)}\\=n\sum_{d|n}\sum_{i=1}^n[(i,n)==d]\frac id\\=n\sum_{d|n}\sum_{i=1}^{\frac nd}[(i,\frac nd)==1]i\\=n\sum_{d|n}\sum_{i=1}^d[(i,d)==1]i\\=n\sum_{d|n}\frac{\varphi(d)d+[d==1]}2Ans=i=1∑n​j=1∑n​lcm(i,j)=2i=1∑n​j=1∑i​lcm(i,j)−2n(n+1)​Let s(n)=i=1∑n​j=1∑i​lcm(i,j),f(n)=i=1∑n​lcm(i,n)∴f(n)=i=1∑n​(i,n)in​=ni=1∑n​(i,n)i​=nd∣n∑​i=1∑n​[(i,n)==d]di​=nd∣n∑​i=1∑dn​​[(i,dn​)==1]i=nd∣n∑​i=1∑d​[(i,d)==1]i=nd∣n∑​2φ(d)d+[d==1]​

此处有一个常识

∑i=1ni[(i,n)==1]=φ(n)n+[n==1]2\sum_{i=1}^ni[(i,n)==1]=\frac {\varphi(n)n+[n==1]}2i=1∑n​i[(i,n)==1]=2φ(n)n+[n==1]​

  • 证明如下

    • 当n&gt;1n&gt;1n>1时,若(i,n)=1&ThickSpace;⟺&ThickSpace;(n−i,n)=1(i,n)=1\iff(n-i,n)=1(i,n)=1⟺(n−i,n)=1,所以与nnn互质的数是成对出现,且他们的和为nnn
    • 再加之n=1n=1n=1的特殊情况,可得

      ∑i=1ni[(i,n)==1]=φ(n)n+[n==1]2\large \sum_{i=1}^ni[(i,n)==1]=\frac {\varphi(n)n+[n==1]}2∑i=1n​i[(i,n)==1]=2φ(n)n+[n==1]​

继续

∴f(n)=n⋅1+∑d∣nφ(d)d2s(n)=∑i=1nf(i)=∑i=1ni(1+∑d∣iφ(d)d)2=n(n+1)2+∑i=1ni∑d∣iφ(d)d2=n(n+1)2+∑d=1nφ(d)d∑d∣ii2=n(n+1)2+∑d=1nφ(d)d2∑i=1⌊nd⌋i2=n(n+1)2+∑i=1ni∑d=1⌊ni⌋φ(d)d22Ans=2s(n)−n(n+1)2=∑i=1ni∑d=1⌊ni⌋φ(d)d2Let h(d)=φ(d)d2,g(n)=∑d=1nh(d)n=∑d∣nφ(d)n3=∑d∣nφ(d)n2=∑d∣nφ(d)d2(nd)2=∑d∣nh(d)(nd)2∑i=1ni3=∑i=1n∑d∣nh(d)(id)2=∑d=1nh(d)∑d∣i(id)2=∑d=1nh(d)∑i=1⌊nd⌋i2=∑i=1ni2∑d=1⌊ni⌋h(d)=∑i=1ni2g(⌊ni⌋)g(n)=∑i=1ni3−∑i=2ni2g(⌊ni⌋)=(n(n+1)2)2−∑i=2ni2g(⌊ni⌋)
\large \therefore f(n)=n\cdot\frac {1+\sum_{d|n}\varphi(d)d}2\\s(n)=\sum_{i=1}^nf(i)=\frac{\sum_{i=1}^ni(1+\sum_{d|i}\varphi(d)d)}2\\=\frac{\frac{n(n+1)}2+\sum_{i=1}^ni\sum_{d|i}\varphi(d)d}2\\=\frac{\frac{n(n+1)}2+\sum_{d=1}^n\varphi(d)d\sum_{d|i}i}2\\=\frac{\frac{n(n+1)}2+\sum_{d=1}^n\varphi(d)d^2\sum_{i=1}^{\lfloor\frac nd\rfloor}i}2\\=\frac{\frac{n(n+1)}2+\sum_{i=1}^ni\sum_{d=1}^{\lfloor\frac ni\rfloor}\varphi(d)d^2}2\\Ans=2s(n)-\frac{n(n+1)}2=\sum_{i=1}^ni\sum_{d=1}^{\lfloor\frac ni\rfloor}\varphi(d)d^2\\Let~h(d)=\varphi(d)d^2,g(n)=\sum_{d=1}^nh(d)\\n=\sum_{d|n}\varphi(d)\\n^3=\sum_{d|n}\varphi(d)n^2\\=\sum_{d|n}\varphi(d)d^2(\frac nd)^2\\=\sum_{d|n}h(d)(\frac nd)^2\\\sum_{i=1}^ni^3=\sum_{i=1}^n\sum_{d|n}h(d)(\frac id)^2\\=\sum_{d=1}^nh(d)\sum_{d|i}(\frac id)^2\\=\sum_{d=1}^nh(d)\sum_{i=1}^{\lfloor\frac nd\rfloor}i^2\\=\sum_{i=1}^ni^2\sum_{d=1}^{\lfloor\frac ni\rfloor}h(d)\\=\sum_{i=1}^ni^2g(\lfloor\frac ni\rfloor)\\g(n)=\sum_{i=1}^ni^3-\sum_{i=2}^ni^2g(\lfloor\frac ni\rfloor)\\=(\frac{n(n+1)}2)^2-\sum_{i=2}^ni^2g(\lfloor\frac ni\rfloor)∴f(n)=n⋅21+∑d∣n​φ(d)d​s(n)=i=1∑n​f(i)=2∑i=1n​i(1+∑d∣i​φ(d)d)​=22n(n+1)​+∑i=1n​i∑d∣i​φ(d)d​=22n(n+1)​+∑d=1n​φ(d)d∑d∣i​i​=22n(n+1)​+∑d=1n​φ(d)d2∑i=1⌊dn​⌋​i​=22n(n+1)​+∑i=1n​i∑d=1⌊in​⌋​φ(d)d2​Ans=2s(n)−2n(n+1)​=i=1∑n​id=1∑⌊in​⌋​φ(d)d2Let h(d)=φ(d)d2,g(n)=d=1∑n​h(d)n=d∣n∑​φ(d)n3=d∣n∑​φ(d)n2=d∣n∑​φ(d)d2(dn​)2=d∣n∑​h(d)(dn​)2i=1∑n​i3=i=1∑n​d∣n∑​h(d)(di​)2=d=1∑n​h(d)d∣i∑​(di​)2=d=1∑n​h(d)i=1∑⌊dn​⌋​i2=i=1∑n​i2d=1∑⌊in​⌋​h(d)=i=1∑n​i2g(⌊in​⌋)g(n)=i=1∑n​i3−i=2∑n​i2g(⌊in​⌋)=(2n(n+1)​)2−i=2∑n​i2g(⌊in​⌋)然后就是杜教筛的形式了,上杜教筛即可.先预处理出小范围的ggg然后较大的就用杜教筛计算

又Ans=∑i=1ni⋅g(⌊ni⌋)\large Ans=\sum_{i=1}^ni\cdot g(\lfloor\frac ni\rfloor)Ans=∑i=1n​i⋅g(⌊in​⌋)

因为ggg函数求解时是用的记忆化,所以在外面套上一层分块优化不会影响ggg函数的时间复杂度,所以复杂度为Θ(n23)\Theta(n^{\frac 23})Θ(n32​)

AC code
  1. #include <cstdio>
  2. #include <map>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. typedef long long LL;
  7. const int mod = 1e9+7;
  8. const int MAXN = 5e6+1;
  9. const int inv2 = 500000004;
  10. const int inv3 = 333333336;
  11. map<LL, LL> G; LL g[MAXN];
  12. int Prime[MAXN], Cnt, phi[MAXN];
  13. bool IsnotPrime[MAXN];
  14. void init()
  15. {
  16. phi[1] = 1;
  17. for(int i = 2; i < MAXN; ++i)
  18. {
  19. if(!IsnotPrime[i]) Prime[++Cnt] = i, phi[i] = i-1;
  20. for(int j = 1; j <= Cnt && i * Prime[j] < MAXN; ++j)
  21. {
  22. IsnotPrime[i * Prime[j]] = 1;
  23. if(i % Prime[j] == 0)
  24. {
  25. phi[i * Prime[j]] = phi[i] * Prime[j];
  26. break;
  27. }
  28. phi[i * Prime[j]] = phi[i] * phi[Prime[j]];
  29. }
  30. }
  31. for(int i = 1; i < MAXN; ++i) g[i] = (g[i-1] + 1ll * phi[i] * i % mod * i % mod) % mod;
  32. }
  33. inline LL sum2(LL i) { return (i%mod) * ((i+1)%mod) % mod * ((2*i+1)%mod) % mod * inv2 % mod * inv3 % mod; }
  34. inline LL calc(LL n)
  35. {
  36. if(n < MAXN) return g[n];
  37. if(G.count(n)) return G[n];
  38. LL ret = (n%mod) * ((n+1)%mod) % mod * inv2 % mod;
  39. ret = ret * ret % mod;
  40. for(LL i = 2, j; i <= n; i=j+1)
  41. {
  42. j = n/(n/i);
  43. ret = (ret - (sum2(j)-sum2(i-1)) % mod * calc(n/i) % mod) % mod;
  44. }
  45. return G[n] = ret;
  46. }
  47. inline LL sum(LL i, LL j) { return ((i+j)%mod) * ((j-i+1)%mod) % mod * inv2 % mod; }
  48. inline LL solve(LL n)
  49. {
  50. LL ret = 0;
  51. for(LL i = 1, j; i <= n; i=j+1)
  52. {
  53. j = n/(n/i);
  54. ret = (ret + sum(i, j) * calc(n/i) % mod) % mod;
  55. }
  56. return ret;
  57. }
  58. int main ()
  59. {
  60. init(); LL n;
  61. scanf("%lld", &n);
  62. printf("%lld\n", (solve(n)+mod)%mod);
  63. }

[51Nod 1238] 最小公倍数之和 (恶心杜教筛)的更多相关文章

  1. 51NOD 1238 最小公倍数之和 V3 [杜教筛]

    1238 最小公倍数之和 V3 三种做法!!! 见学习笔记,这里只贴代码 #include <iostream> #include <cstdio> #include < ...

  2. 【51nod】1238 最小公倍数之和 V3 杜教筛

    [题意]给定n,求Σi=1~nΣj=1~n lcm(i,j),n<=10^10. [算法]杜教筛 [题解]就因为写了这个非常规写法,我折腾了3天…… $$ans=\sum_{i=1}^{n}\s ...

  3. 51 Nod 1238 最小公倍数之和 V3 杜教筛

    题目链接:http://www.51nod.com/Challenge/Problem.html#!#problemId=1238 题意:求$\sum_{i=1}^{n}\sum_{j=1}^{n}l ...

  4. [51Nod1238]最小公倍数之和 V3[杜教筛]

    题意 给定 \(n\) ,求 \(\sum_{i=1}^n \sum_{j=1}^n lcm(i,j)\). \(n\leq 10^{10}\) 分析 推式子 \[\begin{aligned} an ...

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

    51nod 1238 最小公倍数之和 V3 求 \[ \sum_{i=1}^N\sum_{j=1}^N lcm(i,j) \] \(N\leq 10^{10}\) 先按照套路推一波反演的式子: \[ ...

  6. 51nod 1238 最小公倍数之和 V3 【欧拉函数+杜教筛】

    首先题目中给出的代码打错了,少了个等于号,应该是 G=0; for(i=1;i<=N;i++) for(j=1;j<=N;j++) { G = (G + lcm(i,j)) % 10000 ...

  7. 51Nod 1238 - 最小公倍数之和 V3(毒瘤数学+杜教筛)

    题目 戳这里 推导 ∑i=1n∑j=1nlcm(i,j)~~~\sum_{i=1}^{n}\sum_{j=1}^{n}lcm(i,j)   ∑i=1n​∑j=1n​lcm(i,j) =∑i=1n∑j= ...

  8. 51nod 1244 莫比乌斯函数之和 【杜教筛】

    51nod 1244 莫比乌斯函数之和 莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出.梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号.具体定义如下: 如果一个数包含 ...

  9. 51nod 1244 莫比乌斯函数之和(杜教筛)

    [题目链接] http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 [题目大意] 计算莫比乌斯函数的区段和 [题解] 利 ...

随机推荐

  1. jpa简单demo调试druid

    Druid连接池配置见https://www.cnblogs.com/blindjava/p/11504524.html pom <dependency> <groupId>m ...

  2. MIT6.824食用过程

    MIT6.824食用过程 Lab1 MapReduce 一.介绍 本实验使用Go语言构建一个mapreduce库,以及一个容错的分布式系统.第一部分完成一个简单的mapreduce程序,第二部分写一个 ...

  3. python 之 网络编程(基于UDP协议的套接字通信)

    8.5 基于UDP协议的套接字通信 UDP协议:数据报协议 特点:无连接,一发对应一收,先启动哪一端都不会报错 优点:发送效率高,但有效传输的数据量最多为500bytes 缺点:不可靠:发送数据,无需 ...

  4. WUSTOJ 1332: Prime Factors(Java)

    题目链接:1332: Prime Factors Description I'll give you a number , please tell me how many different prim ...

  5. 【Linux】一步一步学Linux——Unix发展史(02)

    目录 00. 目录 01. 请参考Unix传奇 02. 03. 00. 目录 @ 本博客后面会更新 01. 请参考Unix传奇 链接: https://coolshell.cn/articles/23 ...

  6. 【计数DP】种树

    种树 题目描述 事实上,小X邀请两位奆老来的目的远不止是玩斗地主,主要是为了抓来苦力,替他的后花园种树……小X的后花园是环形的,他想在花园周围均匀地种上n棵树,但是奆老花园的土壤当然非同寻常,每个位置 ...

  7. mouseenter 与 mouseover 区别于选择

    mouseover事件, 箭头在子元素移动会触发冒泡事件,  子元素的鼠标箭头可触父元素方法, 相反,mouseenter事件功能与mouseover类似, 但鼠标进入某个元素不会冒泡触发父元素方法. ...

  8. C# Winform 调试时某些项目不会自动重新生成

    右键启动项目→生成依赖性→项目依赖项 →勾选没有重新生成的项目

  9. 前端开发 Vue -4promise解读2

    https://www.runoob.com/vue2/vue-tutorial.html promise promise是什么?   1.主要用于异步计算 2.可以将异步操作队列化,按照期望的顺序执 ...

  10. Go 实现短 url 项目

    首先说一下这种业务的应用场景: 把一个长 url 转换为一个短 url 网址 主要用于微博,二维码,等有字数限制的场景 主要实现的功能分析: 把长 url 地址转换为短 url 地址 通过短 url ...