P3768 简单的数学题

推式子

∑i=1n∑j=1mijgcd(i,j)=∑d=1nd∑i=1n∑j=1mij(gcd(i,j)=d)=∑d=1nd3∑i=1nd∑j=1ndij∑k∣gcd(i,j)=μ(k)=∑d=1nd3∑k=1ndk2μ(k)∑i=1nkdi∑j=1nkdj=∑d=1nd3∑k=1ndk2μ(k)(⌊nkd⌋(1+⌊nkd⌋)2)2我们假设t=kd=∑t=1nt2(⌊nt⌋(1+⌊nt⌋)2)2∑k∣ttkμ(k)=∑t=1nt2ϕ(t)(⌊nt⌋(1+⌊nt⌋)2)2所以我们子要可以通过短时间内筛选出∑t=1nt2ϕ(t),即可通过数论分块来达到要求了。\sum_{i = 1} ^{n} \sum_{j = 1} ^{m} ijgcd(i, j)\\ = \sum_{d = 1} ^{n} d \sum_{i = 1} ^{n} \sum_{j = 1} ^{m}ij(gcd(i, j) = d)\\ = \sum_{d = 1} ^{n} d ^ 3 \sum_{i = 1} ^{\frac{n}{d}} \sum_{j = 1} ^{\frac{n}{d}}ij \sum_{k \mid gcd(i, j)} = \mu(k)\\ = \sum_{d = 1} ^{n} d ^ 3 \sum_{k = 1} ^{\frac{n}{d}} k ^ 2\mu(k) \sum_{i = 1} ^{\frac{n}{kd}}i \sum_{j = 1} ^{\frac{n}{kd}}j\\ = \sum_{d = 1} ^{n} d ^ 3 \sum_{k = 1} ^{\frac{n}{d}} k ^ 2\mu(k) \left(\frac{\lfloor \frac{n}{kd}\rfloor(1 + \lfloor \frac{n}{kd}\rfloor)}{2}\right) ^ 2\\ 我们假设t = kd\\ =\sum_{t = 1} ^{n} t ^ 2 \left(\frac{\lfloor \frac{n}{t}\rfloor(1 + \lfloor \frac{n}{t}\rfloor)}{2}\right) ^ 2\sum_{k \mid t} \frac{t}{k} \mu(k)\\ = \sum_{t = 1} ^{n} t ^ 2 \phi(t) \left(\frac{\lfloor \frac{n}{t}\rfloor(1 + \lfloor \frac{n}{t}\rfloor)}{2}\right) ^ 2\\ 所以我们子要可以通过短时间内筛选出\sum_{t = 1} ^{n} t ^ 2 \phi(t),即可通过数论分块来达到要求了。 i=1∑n​j=1∑m​ijgcd(i,j)=d=1∑n​di=1∑n​j=1∑m​ij(gcd(i,j)=d)=d=1∑n​d3i=1∑dn​​j=1∑dn​​ijk∣gcd(i,j)∑​=μ(k)=d=1∑n​d3k=1∑dn​​k2μ(k)i=1∑kdn​​ij=1∑kdn​​j=d=1∑n​d3k=1∑dn​​k2μ(k)(2⌊kdn​⌋(1+⌊kdn​⌋)​)2我们假设t=kd=t=1∑n​t2(2⌊tn​⌋(1+⌊tn​⌋)​)2k∣t∑​kt​μ(k)=t=1∑n​t2ϕ(t)(2⌊tn​⌋(1+⌊tn​⌋)​)2所以我们子要可以通过短时间内筛选出t=1∑n​t2ϕ(t),即可通过数论分块来达到要求了。

S(n)=∑i=1ni2ϕ(i)=∑i=1nf(i)∑i=1n(f∗g)(i)=∑i=1ng(i)S(ni)g(1)S(n)=∑i=1n(f∗g)(i)−∑d=2ng(i)S(nd)(f∗g)(i)=∑d∣if(d)g(id)=∑d∣id2ϕ(d)g(id)容易想到∑d∣iϕ(d)=i,所以如果可以提出d2那就完美了,我们可以另g(i)=i2,上式变成∑d∣id2ϕ(d)i2d2=i2∑d∣iϕ(d)=i3S(n)=∑i=1ni3−∑d=1nd2S(nd)=n2(n+1)24−∑d=1nd2S(nd)然后数论分块,杜教筛即可得到,S(n) = \sum_{i = 1} ^{n} i ^ 2 \phi(i) = \sum_{i = 1} ^{n} f(i) \\ \sum_{i = 1} ^{n} (f * g)(i) \\ = \sum_{i = 1} ^{n}g(i)S(\frac{n}{i})\\ g(1)S(n) = \sum_{i = 1} ^{n} (f * g)(i) - \sum_{d = 2} ^{n} g(i)S(\frac{n}{d})\\ (f * g)(i) = \sum_{d \mid i} f(d)g(\frac{i}{d}) = \sum_{d \mid i} d ^ 2 \phi(d)g(\frac{i}{d})\\ 容易想到\sum_{d \mid i} \phi(d) = i, 所以如果可以提出d ^ 2那就完美了,我们可以另g(i) = i ^ 2,上式变成\\ \sum_{d \mid i} d ^ 2 \phi(d) \frac{i ^ 2}{d ^ 2} = i ^ 2 \sum_{d \mid i} \phi(d) = i ^ 3 \\S(n) = \sum_{i = 1} ^{n} i ^ 3 - \sum_{d = 1} ^{n} d ^ 2S(\frac{n}{d})\\ = \frac{n ^ 2 (n + 1) ^ 2}{4} - \sum_{d = 1} ^{n} d ^ 2S(\frac{n}{d})\\ 然后数论分块,杜教筛即可得到, S(n)=i=1∑n​i2ϕ(i)=i=1∑n​f(i)i=1∑n​(f∗g)(i)=i=1∑n​g(i)S(in​)g(1)S(n)=i=1∑n​(f∗g)(i)−d=2∑n​g(i)S(dn​)(f∗g)(i)=d∣i∑​f(d)g(di​)=d∣i∑​d2ϕ(d)g(di​)容易想到d∣i∑​ϕ(d)=i,所以如果可以提出d2那就完美了,我们可以另g(i)=i2,上式变成d∣i∑​d2ϕ(d)d2i2​=i2d∣i∑​ϕ(d)=i3S(n)=i=1∑n​i3−d=1∑n​d2S(dn​)=4n2(n+1)2​−d=1∑n​d2S(dn​)然后数论分块,杜教筛即可得到,

代码

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>#define mp make_pair
#define pb push_back
#define endl '\n'
#define mid (l + r >> 1)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define ls rt << 1
#define rs rt << 1 | 1using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-')    f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}const int N = 8e6 + 10;ll phi[N], mod, n, inv4, inv6;int prime[N], cnt;bool st[N];void init() {phi[1] = 1;for(int i = 2; i < N; i++) {if(!st[i]) {prime[cnt++] = i;phi[i] = i - 1;}for(int j = 0; j < cnt && 1ll * i * prime[j] < N; j++) {st[i * prime[j]] = 1;if(i % prime[j] == 0) {phi[i * prime[j]] = phi[i] * prime[j];break;}phi[i * prime[j]] = phi[i] * (prime[j] - 1);}}for(int i = 1; i < N; i++) {phi[i] = (phi[i - 1] + 1ll * i * i % mod * phi[i] % mod) % mod;}
}ll quick_pow(ll a, ll n, ll mod) {ll ans = 1;while(n) {if(n & 1) ans = ans * a % mod;a = a * a % mod;n >>= 1;}return ans;
}ll calc1(ll x) {x %= mod;return 1ll * x * x % mod * (x + 1) % mod * (x + 1) % mod * inv4 % mod;
}ll calc2(ll x) {x %= mod;return x * (x + 1) % mod * (2ll * x + 1) % mod * inv6 % mod;
}unordered_map<ll, ll> ans_phi;ll get_phi(ll x) {if(x < N) return phi[x];if(ans_phi.count(x)) return ans_phi[x];ll ans = calc1(x);for(ll l = 2, r; l <= x; l = r + 1) {r = x / (x / l);ans -= (calc2(r) - calc2(l - 1)) * get_phi(x / l) % mod;ans = (ans % mod + mod) % mod;}return ans_phi[x] = ans;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);mod = read(), n = read();init();inv4 = quick_pow(4, mod - 2, mod), inv6 = quick_pow(6, mod - 2, mod);ll ans = 0;for(ll l = 1, r; l <= n; l = r + 1) {r = n / (n / l);ans += (get_phi(r) - get_phi(l - 1)) % mod * calc1(n / l) % mod;ans = (ans % mod + mod) % mod;}cout << ans << endl;return 0;
}

LaTeX公式代码

\sum_{i = 1} ^{n} \sum_{j = 1} ^{m} ijgcd(i, j)\\
= \sum_{d = 1} ^{n} d \sum_{i = 1} ^{n} \sum_{j = 1} ^{m}ij(gcd(i, j) = d)\\
= \sum_{d = 1} ^{n} d ^ 3 \sum_{i = 1} ^{\frac{n}{d}} \sum_{j = 1} ^{\frac{n}{d}}ij \sum_{k \mid gcd(i, j)} = \mu(k)\\
= \sum_{d = 1} ^{n} d ^ 3 \sum_{k = 1} ^{\frac{n}{d}} k ^ 2\mu(k) \sum_{i = 1} ^{\frac{n}{kd}}i \sum_{j = 1} ^{\frac{n}{kd}}j\\
= \sum_{d = 1} ^{n} d ^ 3 \sum_{k = 1} ^{\frac{n}{d}} k ^ 2\mu(k) \left(\frac{\lfloor \frac{n}{kd}\rfloor(1 + \lfloor \frac{n}{kd}\rfloor)}{2}\right) ^ 2\\
我们假设t = kd\\
=\sum_{t = 1} ^{n} t ^ 2 \left(\frac{\lfloor \frac{n}{t}\rfloor(1 + \lfloor \frac{n}{t}\rfloor)}{2}\right) ^ 2\sum_{k \mid t} \frac{t}{k} \mu(k)\\
= \sum_{t = 1} ^{n} t ^ 2 \phi(t) \left(\frac{\lfloor \frac{n}{t}\rfloor(1 + \lfloor \frac{n}{t}\rfloor)}{2}\right) ^ 2\\
所以我们子要可以通过短时间内筛选出\sum_{t = 1} ^{n} t ^ 2 \phi(t),即可通过数论分块来达到要求了。
S(n) = \sum_{i = 1} ^{n} i ^ 2 \phi(i) = \sum_{i = 1} ^{n} f(i) \\
\sum_{i = 1} ^{n} (f * g)(i) \\
= \sum_{i = 1} ^{n}g(i)S(\frac{n}{i})\\
g(1)S(n) = \sum_{i = 1} ^{n} (f * g)(i) - \sum_{d = 2} ^{n} g(i)S(\frac{n}{d})\\
(f * g)(i) = \sum_{d \mid i} f(d)g(\frac{i}{d}) = \sum_{d \mid i} d ^ 2 \phi(d)g(\frac{i}{d})\\
容易想到\sum_{d  \mid i} \phi(d) = i, 所以如果可以提出d ^ 2那就完美了,我们可以另g(i) = i ^ 2,上式变成\\
\sum_{d \mid i} d ^ 2 \phi(d) \frac{i ^ 2}{d ^ 2} = i ^ 2 \sum_{d \mid i} \phi(d) = i ^ 3
\\S(n) = \sum_{i = 1} ^{n} i ^ 3 - \sum_{d = 1} ^{n} d ^ 2S(\frac{n}{d})\\
= \frac{n ^ 2 (n + 1) ^ 2}{4} - \sum_{d = 1} ^{n} d ^ 2S(\frac{n}{d})\\
然后数论分块,杜教筛即可得到,

P3768 简单的数学题(杜教筛)相关推荐

  1. P3768 简单的数学题 [狄利克雷卷积,杜教筛,莫比乌斯反演]

    简单的数学题 题目连接 https://www.luogu.org/problemnew/show/P3768 题目描述 输入一个正整数n,n≤1010n,n\le 10^{10}n,n≤1010和p ...

  2. (每日一题)P3768 简单的数学题(确信)(莫反 + 欧拉反演 + 杜教筛 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每日一题(莫反 / 多项式 / 母函数 / 群论) 2021.4.20 莫反 和上午的那道题比较类似的 ...

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

    #6229. 这是一道简单的数学题 推式子 ∑i=1n∑j=1ilcm(i,j)gcd(i,j)=(∑i=1n∑j=1nlcm(i,j)gcd(i,j)+n)∗inv2所以重点求∑i=1n∑j=1nl ...

  4. 【洛谷3768】简单的数学题【莫比乌斯反演】【杜教筛】【小学奥数】

    传送门 题意:给定p,Np,Np,N,求 ∑i=1N∑j=1Nijgcd(i,j)modp\sum_{i=1}^{N}\sum_{j=1}^{N}ijgcd(i,j)\text{ }mod \text ...

  5. 51nod 1847 奇怪的数学题(数论/min25筛/杜教筛/斯特林数)

    51nod 1847 奇怪的数学题 求解∑i=1n∑j=1nsgcd(i,j),sgcd\sum_{i=1}^n\sum_{j=1}^nsgcd(i,j),sgcd∑i=1n​∑j=1n​sgcd(i ...

  6. P3768-简单的数学题【莫比乌斯反演,杜教筛】

    正题 题目链接:https://www.luogu.com.cn/problem/P3768 题目大意 给出n,pn,pn,p求∑i=1n∑j=1ngcd(i,j)∗i∗j\sum_{i=1}^n\s ...

  7. [51NOD1847]奇怪的数学题(杜教筛+min_25筛+第二类斯特林数)

    f(x)f(x)f(x)表示xxx的次大约数,有f(x)=xx的最小质因数f(x)=\frac{x}{x的最小质因数}f(x)=x的最小质因数x​,那么 ∑i=1n∑j=1nsgcd(i,j)k=∑i ...

  8. [学习笔记] 初次见面,请多关照 (公式推导+题集)——杜教筛

    筛积性函数的前缀和 常见积性函数 公式推导 狄利克雷卷积 杜教筛 实现 常见卷积 习题集 Sum 神犇和蒟蒻 简单的数学题 常见积性函数 μ\muμ φφφ d(n)d(n)d(n):nnn的约数个数 ...

  9. [复习]莫比乌斯反演,杜教筛,min_25筛

    [复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式: \[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_ ...

最新文章

  1. VMware的网卡设置模式
  2. Docker安装部署RabbitMQ
  3. 为什么我要用C写游戏 适合自己的才是最好的
  4. JavaScript进阶1-学习笔记
  5. php7和php8内核有区别吗,不要在PHP7中踩这些坑
  6. Docker最全教程——从理论到实战(二)
  7. MySQL将表中的yes改成no_mysql在不需要改程序的情况下通过操作数据库对单表数据量大的表进行分表...
  8. java复习系列[2] - Java多线程
  9. SQL Server:如何加入第一行
  10. 初次使用CocoaPods遇到的问题总结
  11. Pravega Flink Connector Table API 进阶功能探秘
  12. 柯洁放言力拼AlphaGo:我抱有必死的信念!(全部细节都在这里)
  13. Windows 7 “Tunnel adapter Local Area Connection” 现象(IPv6)
  14. Hadoop安装教程——单机 / 伪分布式配置
  15. miui8 android版本,miui8官方正式版下载_小米8系统安卓下载|好特下载
  16. 一个很酷的快速开发代码生成器系统
  17. Ubuntu系统截图方法
  18. Linux上一个恶意程序分析实例:一步一步揭开病毒程序的面纱1
  19. POST /product/:id 获取单个商品
  20. vue项目初始化出现tar ENOENT: no such file or directory错误的解决办法。

热门文章

  1. 机器学习资料第3版,助你继续成长!
  2. 区块链、自动驾驶、人工智能鏖战开始 谁将成为下一个风口?
  3. 你的专业 VS 你妈口中你的专业
  4. 怎么在php登录首页添加样式,首页登录后怎么在首页显示用户名以及隐藏登录框?...
  5. stc单片机c语言 pdf,STC单片机C语言程序设计 第13章 STC单片机C语言指针.pdf
  6. 安装mysql二进制文件_MySQL二进制文件规范安装
  7. oracle 磁盘挂载格式化,Linux简单磁盘挂载
  8. mysql修改字段的顺序_Mysql中如何修改字段的排列顺序?
  9. python怎么安装开发版_python - easy_install的安装和使用
  10. 计算机软件在矿井地质中的应用,(完整版)遥感导论知识点整理(梅安新版)