\(\color{#0066ff}{ 题目描述 }\)

这是一道非常简单的数学题。

最近 LzyRapxLzyRapx 正在看 mathematics for computer science 这本书,在看到数论那一章的时候, LzyRapxLzyRapx 突然想到这样一个问题。

\[F(n)=\sum_{i=1}^n\sum_{j=1}^i\frac{\mathrm{lcm}(i,j)}{\mathrm{gcd}(i,j)}
\]

其中,\(\mathrm{lcm}(a,b)\) 表示 \(a\) 和 \(b\) 的最小公倍数,\(\mathrm{gcd}(a,b)\) 表示 \(a\) 和 \(b\) 的最大公约数。

给定 \(n\) ,让你求: \(F(n) \bmod1000000007\)。

\(L\) 同学太菜啦,QAQ,并不会做这道简单题,所以他想请你帮他解决这个问题。

\(\color{#0066ff}{输入格式}\)

输入一行,一个正整数 \(n\,(1 \le n \le 10^9)\)。

\(\color{#0066ff}{输出格式}\)

输出 \(F(n)\) ,对 \(10^9 + 7\) 取模。

\(\color{#0066ff}{输入样例}\)

  1. 5

\(\color{#0066ff}{输出样例}\)

  1. 84

\(\color{#0066ff}{数据范围与提示}\)

对于所有数据,\(1 \le n \le 10^9\)。

\(\color{#0066ff}{ 题解 }\)

开始推式子

题目要求

\[F(n)=\sum_{i=1}^n\sum_{j=1}^i\frac{\mathrm{lcm}(i,j)}{\mathrm{gcd}(i,j)}
\]

可以考虑求

\[F(n)=\sum_{i=1}^n\sum_{j=1}^n\frac{\mathrm{lcm}(i,j)}{\mathrm{gcd}(i,j)}
\]

然后发现我们要求的答案是下图S1+S3,上面的式子是整个正方形

于是答案可以等于(正方形+对角线)的一半

所以问题转为了下面的式子,顺便改写为gcd形式

\[F(n)=\sum_{i=1}^n\sum_{j=1}^n\frac{i*j}{\mathrm{gcd}(i,j)^2}
\]

于是,枚举gcd

\[\sum_{d=1}^n\sum_{i=1}^n\sum_{j=1}^n [gcd(i,j)==d]\frac{i*j}{d^2}
\]

后面把d弄出来

\[\sum_{d=1}^n\sum_{i=1}^{\lfloor \frac n d \rfloor}\sum_{j=1}^{\lfloor \frac n d \rfloor} [gcd(i,j)==1]i*j
\]

利用\(\mu * i = e\)套进去

\[\sum_{d=1}^n \sum_{i=1}^{\lfloor \frac n d \rfloor}\sum_{j=1}^{\lfloor \frac n d \rfloor} \sum_{k|gcd(i,j)} \mu(k)*i*j
\]

\[\sum_{d=1}^n \sum_{k=1}^{\lfloor\frac n d \rfloor}\sum_{k|i} \sum_{k|j} \mu(k)*i*j
\]

改为枚举倍数

\[\sum_{d=1}^n \sum_{k=1}^{\lfloor\frac n d \rfloor} \mu(k)*k^2\sum _{i=1}^{\lfloor\frac n {kd}\rfloor} \sum _{j=1}^{\lfloor\frac n {kd}\rfloor}i*j
\]

然后pd换q的套路

\[\sum_{q=1}^n\sum_{k|q} \mu(k)* k^2 (\sum _{i=1}^{\lfloor\frac n {q}\rfloor}i)^2
\]

\[令f(i)=\sum_{k|i}\mu(k) * k^2, g(i)=i^2,t(i)=\mu(i)*i^2
\]

我们现在要求的\(h=f*g\)这样才能杜教筛

考虑将f拆开,可以发现\(f=t*1\)

于是\(h=t*1*g=t*g*1\)

然后可以神奇的发现

\[(t*g)(n)=n^2*\sum_{d|n} \mu(d)=e
\]

然后。。。

\[h=t*g*1=e*1=1
\]

额,\(h(n)=1\)

不过杜教筛的前半部分是要线性筛的,这东西咋弄啊?

可以发现,\(\mu(d)*d^2\) 是一个积性函数*完全积性函数

所以\(\mu(d)*d^2\)肯定是记性函数

而f是这东西卷上一个1,所以肯定是积性函数,随便筛就行了qwq

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. LL in() {
  4. char ch; LL x = 0, f = 1;
  5. while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
  6. for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
  7. return x * f;
  8. }
  9. const int mod = 1e9 + 7;
  10. const int maxn = 4e6 + 10;
  11. std::map<int, LL> mp;
  12. LL pri[maxn], mu[maxn], tot, six;
  13. bool vis[maxn];
  14. LL ksm(LL x, LL y) {
  15. LL re = 1LL;
  16. while(y) {
  17. if(y & 1) re = re * x % mod;
  18. x = x * x % mod;
  19. y >>= 1;
  20. }
  21. return re;
  22. }
  23. void predoit() {
  24. six = ksm(6, mod - 2);
  25. mu[1] = 1;
  26. vis[1] = true;
  27. for(LL i = 2; i < maxn; i++) {
  28. if(!vis[i]) pri[++tot] = i, mu[i] = 1 - (LL)i * i;
  29. for(int j = 1; j <= tot && (LL)i * pri[j] < maxn; j++) {
  30. vis[i * pri[j]] = true;
  31. if(i % pri[j] == 0) {
  32. mu[i * pri[j]] = mu[i];
  33. break;
  34. }
  35. else mu[i * pri[j]] = mu[i] * mu[pri[j]];
  36. }
  37. }
  38. for(int i = 2; i < maxn; i++) mu[i] = (mu[i] + mu[i - 1]) % mod;
  39. }
  40. LL gettot(LL x) {
  41. x %= mod;
  42. LL ans = (x * (x + 1) >> 1) % mod;
  43. return ans * ans % mod;
  44. }
  45. LL getpfh(LL x) {
  46. x %= mod;
  47. LL ans = x;
  48. ans = (ans * (x + 1)) % mod;
  49. ans = (ans * ((x << 1LL) + 1)) % mod;
  50. return ans * six % mod;
  51. }
  52. LL getmu(LL n) {
  53. if(n < maxn) return mu[n];
  54. if(mp.count(n)) return mp[n];
  55. LL ans = n;
  56. for(LL l = 2, r; l <= n; l = r + 1) {
  57. r = n / (n / l);
  58. LL tot1 = ((getpfh(r) - getpfh(l - 1)) % mod + mod) % mod;
  59. tot1 = (tot1 * getmu(n / l)) % mod;
  60. ans = ((ans - tot1) % mod + mod) % mod;
  61. }
  62. return mp[n] = ans;
  63. }
  64. LL work(LL n) {
  65. LL ans = 0;
  66. for(LL l = 1, r; l <= n; l = r + 1) {
  67. r = n / (n / l);
  68. LL tot1 = ((getmu(r) - getmu(l - 1)) % mod + mod) % mod;
  69. tot1 = tot1 * gettot(n / l) % mod;
  70. ans = (ans + tot1) % mod;
  71. }
  72. return ((ans + n) % mod) * ksm(2, mod - 2) % mod;
  73. }
  74. int main() {
  75. predoit();
  76. printf("%lld\n", work(in()));
  77. return 0;
  78. }

loj#6229 这是一道简单的数学题的更多相关文章

  1. loj#6229. 这是一道简单的数学题 (??反演+杜教筛)

    题目链接 题意:给定\(n\le 10^9\),求:\(F(n)=\sum_{i=1}^n\sum_{j=1}^i\frac{\mathrm{lcm}(i,j)}{\mathrm{gcd}(i,j)} ...

  2. LOJ#6229. 这是一道简单的数学题(莫比乌斯反演+杜教筛)

    题目链接 \(Description\) 求\[\sum_{i=1}^n\sum_{j=1}^i\frac{lcm(i,j)}{gcd(i,j)}\] 答案对\(10^9+7\)取模. \(n< ...

  3. loj6229 这是一道简单的数学题

    https://loj.ac/problem/6229 题解:https://blog.csdn.net/Vectorxj/article/details/79094659 套路推式子,杜教筛,证明复 ...

  4. 【acmm】一道简单的数学题

    emm卡常 我本来写成了这个样子: #include<bits/stdc++.h> using namespace std; typedef long long LL; ; struct ...

  5. 【学术篇】luogu3768 简单的数学题(纯口胡无代码)

    真是一道"简单"的数学题呢~ 反演题, 化式子. \[ ans=\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j) \\ =\sum_{i=1}^n\sum_{j ...

  6. NYOJ 330 一个简单的数学题【数学题】

    /* 题目大意:求解1/n; 解题思路:写一个输出小数的算法 关键点:怎样处理小数点循环输出 解题人:lingnichong 解题时间:2014-10-18 09:04:22 解题体会:输出小数的算法 ...

  7. 又一道简单题&&Ladygod(两道思维水题)

    Ladygod Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit S ...

  8. 【数学】HPU--1037 一个简单的数学题

    1037: 一个简单的数学题 [数学] 时间限制: 1 Sec 内存限制: 128 MB提交: 259 解决: 41 统计 题目描述 小明想要知道$a^b$的值,但是这个值会非常的大. 所以退而求其次 ...

  9. 【Luogu3768】简单的数学题(莫比乌斯反演,杜教筛)

    [Luogu3768]简单的数学题(莫比乌斯反演,杜教筛) 题面 洛谷 \[求\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j)\] $ n<=10^9$ 题解 很明显的把\( ...

随机推荐

  1. Unreal Engine 4 Radiant UI 入门教程(一)制作Radiant HUD

    请注意:本篇教程的编号是从零开始的,如果没有看第零篇教程,请前往学习. 本教程介绍如何制作Radiant HUD,这是指将网页元素直接加入到HUD中,效果为: 对应的网页元素为: 第一步: 将之前下载 ...

  2. kafka集群安装和kafka-manager

    1.软件环境 (3台服务器-测试)10.11.12.31 mykafka110.11.12.32 mykafka210.11.12.33 mykafka3 [root@localhost ~]# ca ...

  3. 转:利用UDEV服务解决RAC ASM存储设备名

    利用UDEV服务解决RAC ASM存储设备名 好文转载,链接:http://www.askmaclean.com/archives/utilize-udev-resolve-11gr2-rac-asm ...

  4. MySQL 学习五 SQL实用函数

    0 select now() 显示当前时间. 1 select char_length('andyqan')   显示字符长度. 2 日期格式化         select date_format( ...

  5. mybatis 学习二 MyBatis简介与配置MyBatis+Spring+MySql

    1.2.2建立MySql数据库 在C:\Program Files\MySQL\MySQL Server 5.7\bin下面: 首先连接MySQL:        mysql  -u root -p ...

  6. 环形缓冲区的应用ringbuffer

    在嵌入式开发中离不开设备通信,而在通信中稳定性最高的莫过于环形缓冲区算法, 当读取速度大于写入速度时,在环形缓冲区的支持下不会丢掉任何一个字节(硬件问题除外). 在通信程序中,经常使用环形缓冲区作为数 ...

  7. IC卡和RFID卡的区别(网上说的都不准确)

    其实IC卡是卡类型的称呼,IC卡和RFID卡不应该在一起对比的,和IC卡在一起对比的应该是ID卡. RFID卡是其实是对卡技术类型称呼. IC为卡类型称呼(Integrated Circuit Car ...

  8. CentOS 7.2 部署Rsync + Lsyncd服务实现文件实时同步/备份 (二)

    发送端配置: 一.配置密钥 1. 主/从服务器之间启用基于密钥的身份验证.登录发送端服务器并用 " ssh-keygen " 命令生成公共或私有的密钥. 2. 使用 " ...

  9. delphi 组件安装工具开发

    当一个组件的dpk文件数量较多且安装工具不顺手的时候,写一个属于自己的组件安装工具就很有必要了. 本例以 Dev Express 16.1.2 为例,设计一个组件安装工具,以便更深入理解 delphi ...

  10. java 多线程系列基础篇(八)之join()、start()、run()方法

    1. join()介绍 join() 定义在Thread.java中.join() 的作用:让“主线程”等待“子线程”结束之后才能继续运行.这句话可能有点晦涩,我们还是通过例子去理解: // 主线程 ...