P3768 简单的数学题(杜教筛)

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=1nj=1mijgcd(i,j)=d=1ndi=1nj=1mij(gcd(i,j)=d)=d=1nd3i=1dnj=1dnijkgcd(i,j)=μ(k)=d=1nd3k=1dnk2μ(k)i=1kdnij=1kdnj=d=1nd3k=1dnk2μ(k)(2kdn(1+kdn))2t=kd=t=1nt2(2tn(1+tn))2ktktμ(k)=t=1nt2ϕ(t)(2tn(1+tn))2t=1nt2ϕ(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=1ni2ϕ(i)=i=1nf(i)i=1n(fg)(i)=i=1ng(i)S(in)g(1)S(n)=i=1n(fg)(i)d=2ng(i)S(dn)(fg)(i)=dif(d)g(di)=did2ϕ(d)g(di)diϕ(d)=i,d2g(i)=i2did2ϕ(d)d2i2=i2diϕ(d)=i3S(n)=i=1ni3d=1nd2S(dn)=4n2(n+1)2d=1nd2S(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})\\
然后数论分块,杜教筛即可得到,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

博客园翻车启示录

开发者的日常作为一名996的开发者&#xff0c;我几乎每天只有两件事&#xff0c;制造bug和解决bug&#xff0c;这两件事&#xff0c;既替我解决了温饱问题、也替产品经理、测试工程师等一票人解决了吃穿问题。嗯&#xff0c;有人为我这种程序员评了一个等级&#xff0c;我大概是…

[2020多校A层11.25]最大K段和(反悔贪心)

[2020多校A层11.25]最大K段和 对于一个长度为n的序列&#xff0c;求解不相交的k段使得他们的总和最大&#xff0c;输出最大值。 n<1e5 对于这种问题&#xff0c;我们没有思路求解&#xff0c;可以考虑枚举&#xff0c;发现无法枚举&#xff0c;然后考虑dp&#xff0c;发现…

asp.net core 从单机到集群

asp.net core 从单机到集群Intro这篇文章主要以我的活动室预约的项目作为示例&#xff0c;看一下一个 asp.net core 应用从单机应用到集群部署需要做什么。示例项目活动室预约提供了两个版本&#xff0c;集群版和 单机版单机版方便部署&#xff0c;不依赖其他环境&#xff0c;数…

杜教筛模板(P4213 【模板】杜教筛(Sum))

P4213 【模板】杜教筛&#xff08;Sum&#xff09; 套路推式子 求s(n)∑i1nf(i)∑i1n(f∗g)(i)∑i1n∑d∣if(d)g(id)∑d1n∑i1⌊nd⌋f(i)g(d)∑d1ng(d)S(⌊nd⌋)g(1)S(n)∑d2ng(d)S(⌊nd⌋)则有g(1)S(n)∑i1n(f∗g)(i)−∑d2ng(d)S(⌊nd⌋)求s(n) \sum_{i 1} ^{n}f(i)\\ \su…

[2020多校A层12.1]树(倍增/单调栈/dfs栈)

[2020多校A层12.1]树 求解树上从u到v的最长贪心上升序列&#xff0c;也就是只要有比它大的就选择它&#xff0c;可以发现这个问题性质&#xff0c;就是每个点对应了唯一的一个第一个比它大的点&#xff0c;那么我们可以向它们之间连边&#xff0c;然后问题就转化为求解从当前点…

通过Blazor使用C#开发SPA单页面应用程序(3)

通过Blazor使用C#开发SPA单页面应用程序(1)通过Blazor使用C#开发SPA单页面应用程序(2)今天我们来看看Blazor开发的一些基本知识。Blazor中组件的基本结构可以分为3个部分&#xff0c;如下所示&#xff1a;//Counter.razor//Directives section 指令部分page "/counter&qu…

NC14250 MMSet2

MMSet2 思路 这道题目显然能够通过31051063 \times 10 ^ 5 \times 10 ^ 63105106的复杂度来暴力&#xff0c;这显然不能达到题目要求的复杂度&#xff0c;因此我们可以对题目要求我们计算的东西进行转换。 某个点到所有点集的最大距离最小&#xff0c;这就有点像是重心的求法…

[2020多校A层12.3]虚构推理(语言/二分/数据结构)

[2020多校A层12.3]虚构推理 给定n个时钟精确到秒&#xff0c;求解一个时间&#xff0c;使得它的指针和所有其他的时钟时针和分针分别的角度最大值最小。 一道毒瘤的二分题&#xff0c;看到最大值最小&#xff0c;我们很容易想到二分答案。然后我们的关键是check&#xff0c;那…

ASP.NET CORE 2.* 利用集成测试框架覆盖HttpClient相关代码

ASP.NET CORE 集成测试官方介绍我的asp.net core 项目里面大部分功能都是去调用别人的API &#xff0c;大量使用HttpClient&#xff0c;公司单元测试覆盖率要求95%以上&#xff0c;很难做到不mock HttpClient 达到这个指数。以下方法是我自己总结的在单元测试里 mock httpClien…

Expected Value Again(咕咕咕)

Expected Value Again 神题&#xff01;&#xff01;&#xff01;

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

1238 最小公倍数之和 V3 推式子 ∑i1n∑j1nlcm(i,j)∑i1n∑j1nijgcd(i,j)∑d1n∑i1n∑j1nijd(gcd(i,j)d)∑d1nd∑i1nd∑j1ndij(gcd(i,j)1)∑d1nd∑i1nd∑j1ndij∑k∣gcd(i,j)μ(k)∑d1nd∑k1ndk2μ(k)∑i1ndk∑j1ndkij\sum_{i 1} ^{n} \sum_{j 1} ^{n} lcm(i, j)\\ \sum_{i…

Let's Encrypt网站推出中文版

如今很多网站都强制使用 HTTPS 加密协议访问&#xff0c;安全性有了很大的提高&#xff0c;最起码在数据传输的初始阶段数据包不会被劫持&#xff0c;保证了客户端与服务器端的通讯安全性。说到 HTTPS 加密协议&#xff0c;就不得不提 Let’s Encrypt。Let’s Encrypt 是一家不…

动态分配内存

https://www.runoob.com/cplusplus/cpp-dynamic-memory.html

[51 nod 123] 最大公约数之和 V3(杜教筛)

1237 最大公约数之和 V3 推式子 ∑i1n∑j1ngcd(i,j)∑d1nd∑i1n∑j1n(gcd(i,j)d)∑d1nd∑i1nd∑j1nd(gcd(i,j)1)∑d1nd∑i1nd∑j1nd∑k∣gcd(i,j)μ(k)∑d1nd∑k1ndμ(k)∑i1nkd∑j1nkd1套路地设tkd∑t1n(⌊nt⌋)2∑d∣tdμ(td)∑t1n(⌊nt⌋)2ϕ(t)接下来就是杜教筛求∑i1nϕ(…

使用WebDeploy部署远程IIS网站

目录 使用WebDeploy部署远程IIS网站后台服务部署服务器配置本地WebDeploy发布文件配置前端页面部署WebDeploy服务端配置WebDeploy发布文件配置使用WebDeploy部署远程网站后台服务部署服务器配置打开IIS管理器(开始->控制面板->管理工具->IIS管理器)添加网站(右键网站…

数列分块入门

文章目录数列分块入门1数列分块入门2数列分块入门3数列分块入门4数列分块入门5数列分块入门6数列分块入门7数列分块入门8数列分块入门9数列分块入门1 区间加&#xff0c;单点查询 分块后&#xff0c;维护标记&#xff0c;零散块暴力加&#xff0c;查询时输出值加标记 数列分块…

CF436F Banners(分块/凸包/单调队列)

CF436F Banners 首先有n个物品分别有ai和bi&#xff0c;然后定义价值为 c∗wp∗(ai大于p且bi小于c的用户个数)c*wp*(ai大于p且bi小于c的用户个数)c∗wp∗(ai大于p且bi小于c的用户个数) 然后我们需要求解对于每一个c的最大价值和对应的p 首先我们先枚举c&#xff0c;然后每次加…

译 | 改进 Visual Studio 及 Windows 上 .NET Core 的安装体验

点击上方蓝字关注“汪宇杰博客”原文&#xff1a;Lee Coward翻译&#xff1a;Edi Wang导语Visual Studio 2019 16.3 和 .NET Core 3.0 Preview 7 改进了 Windows 上 .NET Core 的安装体验。目标是减少计算机上可能存在的 .NET Core 版本的数量。这些改进基于客户反馈和我们自己…

F. Ivan and Burgers(前缀线性基模板)

前缀线性基模板 F. Ivan and Burgers /*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, …

P2231 [HNOI2002]跳蚤(裴蜀定理/莫比乌斯反演)

P2231 [HNOI2002]跳蚤 给定一个长度为n1的一列数&#xff0c;第n1位为m&#xff0c;前n位小于m 求解使得他n1个数的加减可以凑出1的方案数 首先可以凑出1&#xff0c;这显然是裴蜀定理&#xff0c;推一推就发现他要求所有数的gcd为1 那么对于要求gcd恰为x的计数问题&#xff…