P6222 「P6156 简单题」(反演 + 积性函数线性筛)

P6156 简单题

推式子

∑i=1n∑j=1n(i+j)kf(gcd(i,j))gcd(i,j)=∑i=1n∑j=1n(i+j)kμ2(gcd(i,j))gcd(i,j)=∑d=1nμ2(d)dk+1∑i=1nd∑j=1nd(i+j)k(gcd(i,j)==1)=∑d=1nμ2(d)dk+1∑p=1ndp2μ(p)∑i=1npd∑j=1npd(i+j)kt=pd,f(n)=∑i=1n∑j=1n(i+j)k=∑t=1nf(nt)tk∑d∣tμ2(d)μ(td)d\sum_{i = 1} ^{n} \sum_{j = 1} ^{n}(i + j) ^ kf(gcd(i, j))gcd(i, j)\\ = \sum_{i = 1} ^{n} \sum_{j = 1} ^{n} (i + j) ^ k \mu ^ 2(gcd(i, j)) gcd(i, j)\\ = \sum_{d = 1} ^{n} \mu ^ 2 (d) d ^ {k + 1} \sum_{i = 1} ^{\frac{n}{d}} \sum_{j = 1} ^{\frac{n}{d}} (i + j) ^ k (gcd(i, j) == 1)\\ = \sum_{d = 1} ^{n} \mu ^ 2(d) d ^ {k + 1} \sum_{p = 1} ^{\frac{n}{d}} p ^ 2 \mu(p) \sum_{i = 1} ^{\frac{n}{pd}} \sum_{j = 1} ^{\frac{n}{pd}} (i + j) ^ k\\ t = pd, f(n) = \sum_{i = 1} ^{n} \sum_{j = 1} ^{n} (i + j) ^ k \\ = \sum_{t = 1} ^{n} f(\frac{n}{t})t ^ k \sum_{d \mid t} \mu ^ 2(d) \mu(\frac{t}{d}) d\\ i=1nj=1n(i+j)kf(gcd(i,j))gcd(i,j)=i=1nj=1n(i+j)kμ2(gcd(i,j))gcd(i,j)=d=1nμ2(d)dk+1i=1dnj=1dn(i+j)k(gcd(i,j)==1)=d=1nμ2(d)dk+1p=1dnp2μ(p)i=1pdnj=1pdn(i+j)kt=pd,f(n)=i=1nj=1n(i+j)k=t=1nf(tn)tkdtμ2(d)μ(dt)d

我们先对f(n)f(n)f(n)分析:
假定a(n)=∑i=1nik,b(n)=∑i=1n∑j=1ijk=∑i=1na(i)简单化简一下就可以得到f(n)=b(2n)−2b(n)显然我们可以通过欧拉筛得到ik,然后一次前缀和得到a(i),再一次前缀和得到b(i)假定a(n) = \sum_{i = 1} ^{n} i ^ k,b(n) = \sum_{i = 1} ^{n} \sum_{j = 1} ^{i} j ^ k = \sum_{i = 1} ^{n} a(i) \\ 简单化简一下就可以得到f(n) = b(2n) - 2b(n)\\ 显然我们可以通过欧拉筛得到i ^ k,然后一次前缀和得到a(i), 再一次前缀和得到b(i)\\ a(n)=i=1nikb(n)=i=1nj=1ijk=i=1na(i)f(n)=b(2n)2b(n)ika(i),b(i)
接下来我们对f(n)=∑d∣nμ2(d)μ(nd)df(n) = \sum_{d \mid n} \mu^ 2(d) \mu(\frac{n}{d})df(n)=dnμ2(d)μ(dn)d分析:
显然这是一个积性函数,所以f(n)=f(pk)f(npk),当k=0,f(1)=1,当k=1,f(p)=p−1,当k=2,f(p2)=−p,当k>=3,显然对任意一项d,或者nd一定有一项存在平方项,所以μ会变成0,所以k>=3f(pk)=0所以这个积性函数我们只要在欧拉筛中特判处理一下即可。显然这是一个积性函数,所以f(n) = f(p ^ k) f(\frac{n}{p ^ k}),\\ 当k = 0, f(1) = 1,\\ 当k = 1, f(p) = p - 1,\\ 当k = 2, f(p ^ 2) = -p,\\ 当k >= 3,显然对任意一项d,或者\frac{n}{d}一定有一项存在平方项,所以\mu会变成0,\\ 所以k >= 3 f(p ^ k) = 0\\ 所以这个积性函数我们只要在欧拉筛中特判处理一下即可。 f(n)=f(pk)f(pkn)k=0,f(1)=1,k=1,f(p)=p1,k=2,f(p2)=p,k>=3ddnμ0,k>=3f(pk)=0

代码

P6222 「P6156 简单题」加强版

这道题目的加强版本,由于我这里采用的是线性复杂度的算法,所以只要稍加修改即可过这道题。

/*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 = 1e7 + 10, mod = 998244353;int prime[N], cnt;ll f[N], pw[N], n, k;bool st[N];ll quick_pow(ll a, ll n) {ll ans = 1;while(n) {if(n & 1) ans = ans * a % mod;a = a * a % mod;n >>= 1;}return ans;
}void init() {f[1] = pw[1] = 1;for(int i = 2; i < N; i++) {if(!st[i]) {prime[cnt++] = i;f[i] = i - 1;pw[i] = quick_pow(i, k);}for(int j = 0; j < cnt && i * prime[j] < N; j++) {pw[i * prime[j]] = pw[i] * pw[prime[j]] % mod;st[i * prime[j]] = 1;if(i % prime[j] == 0) {int temp = i / prime[j];if(temp % prime[j]) f[i * prime[j]] = (mod - 1ll * prime[j] * f[temp] % mod) % mod;break;}f[i * prime[j]] = f[i] * f[prime[j]] % mod;}}for(int i = 1; i < N; i++) f[i] = (f[i - 1] + f[i] * pw[i] % mod) % mod, pw[i] = (pw[i] + pw[i - 1]) % mod;for(int i = 1; i < N; i++) pw[i] = (pw[i] + pw[i - 1]) % mod;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);n = read(), k = read(), init();ll ans = 0;for(ll l = 1, r; l <= n; l = r + 1) {r = n / (n / l);ans = (ans + (f[r] - f[l - 1] + mod) % mod * (((pw[2 * (n / l)] - 2 * pw[n / l]) % mod + mod) % mod) % mod) % mod;}printf("%lld\n", ans);return 0;
}

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

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

相关文章

推荐高质量的公众号,值得跟进学习!

为大家推荐几个高质量的公众号&#xff1a;当你迷茫的时候刷刷这些大公司的牛人所运营的公众号&#xff0c;就可以知道自己的不足&#xff0c;不是仅仅局限于.NET技术之下&#xff0c;通过他们扩展我们的知识宽度&#xff0c;我们可以一起来学习。人工智能爱好者社区专注人工智…

P3733 [HAOI2017]八纵八横(线性基/线段树分治)

P3733 [HAOI2017]八纵八横 这是那道线性基的加强版&#xff0c;现在要求从1节点出发的一条路径异或和最大&#xff0c;并且还要支持修改权值和加边删边。 我们可以直接线段树分治然后将所有修改用vector存下来&#xff0c;然后最后dfs一遍整个线段树&#xff0c;然后每次类似…

.net core redis的全套操作

Redis支持五种数据类型&#xff1a;string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xff08;列表&#xff09;&#xff0c;set&#xff08;集合&#xff09;及zset(sorted set&#xff1a;有序集合)。Redis支持主从同步…

二次剩余模板

二次剩余模板 x2≡n(modp)x ^ 2 \equiv n \pmod px2≡n(modp) /*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 l…

CF938G Shortest Path Queries(线性基/线段树分治/异或)

CF938G Shortest Path Queries 支持加边删边和查询两点之间的异或最短路&#xff0c;我们可以使用线段树分治&#xff0c;然后利用线性基求解。 但是这里图可能不是联通的&#xff0c;所以查询两点之间的异或和需要边带权并查集维护&#xff0c;然后还不能路径压缩&#xff0…

Stack Overflow引入CROKAGE,搜问题不用再东拼西凑

许多开发者使用 Stack Overflow 搜索开发中遇到的问题&#xff0c;有时候需要查询的结果中有通俗的讲解&#xff0c;而且最好还能够带上代码 demo&#xff0c;但是两者同时很完美地满足要求还是比较困难的。不过最近 Stack Overflow 官方博客上介绍了一种智能化的技术&#xff…

P2487 [SDOI2011]拦截导弹(cdq分治/计数问题思想)

P2487 [SDOI2011]拦截导弹 求解二维上的LIS&#xff0c;并且要求出每个点的选中概率。 首先对于每个点的选中概率&#xff0c;可以通过方案数计算&#xff0c;那么就是选中它的方案数除以总方案数。关键在于选中它的方案数怎么求&#xff0c;可以通过以它开头的LIS方案数和以…

dsu on tree 题集 + ac代码

文章目录**入门讲解****[600E - Lomsat gelral](https://codeforces.ml/problemset/problem/600/E)****[树上数颜色](https://www.luogu.org/problemnew/show/U41492)****[570D - Tree Requests](https://codeforces.ml/problemset/problem/570/D)****[ 阔力梯的树](https://ac…

使用Kubectl部署应用

目录 使用Kubectl部署应用 Kubectl部署流程 部署一个简单的Demo网站 使用Kubectl部署应用一旦运行了Kubernetes集群&#xff0c;就可以在其上部署容器化应用程序。因此在开始之前&#xff0c;我们需要先确保集群已经准备就绪&#xff0c;无论是使用Minikube还是kubeadm创建的集…

SP22343 NORMA2 - Norma(分治优化复杂度)

SP22343 NORMA2 - Norma 一看就像是一个序列分治的题目&#xff0c;求解序列上区间长度乘区间最大值最小值的和&#xff0c;然后考虑如何处理&#xff0c;分治之后每次就可以将右边部分分成三部分&#xff0c;然后对于这三部分可以批量求和&#xff0c;这样就起到优化复杂度的…

Docker系列之.NET Core入门(三)

在Docker生态系统中除了上一节所讲解的基本概念&#xff0c;还有其他专业术语&#xff0c;本文我们将一笔带过&#xff0c;同时会开始陆续进入到在.NET Core中使用Docker。专业术语Docker Engine&#xff08;Docker引擎&#xff09;&#xff1a;客户端 - 服务器应用程序。Docke…

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

P3911 最小公倍数之和 推式子 ∑i1n∑j1nlcm(ai,aj)下面的nmax(ai)&#xff0c;ci为i在原数组中出现的次数∑i1n∑j1nijgcd(ij)cicj∑d1n1d∑i1n∑j1nijcicj(gcd(i,j)d)∑d1nd∑i1nd∑j1ndijcidcjd∑k∣gcd(i,j)μ(k)∑d1nd∑k1ndμ(k)k2∑i1nkd∑j1nkdijcikdcjkd∑t1nt(∑i1n…

P5502 [JSOI2015]最大公约数(gcd性质/min性质/分治)

P5502 [JSOI2015]最大公约数 对于求解(r-l1)*gcd(l,r)的最大值&#xff0c;首先我们有一个性质&#xff0c;就是一个前缀的gcd本质不同个数只有log个&#xff0c;所以我们可以利用这个性质&#xff0c;然后每次分治处理&#xff0c;每一层的复杂度可以做到O(n)因为枚举前缀后缀…

2019南昌网络赛G. tsy‘s number(反演 + 积性函数O(n)预处理)

tsy’s number 推式子 ∑i1n∑j1n∑k1nϕ(i)ϕ(j2)ϕ(k3)ϕ(i)ϕ(j)ϕ(k)ϕ(gcd(i,j,k))我们假定jp1k1p2k2p3p3……pnkn&#xff0c;有ϕ(j)p1k1−1(p1−1)p2k2−1(p2−1)p3k3−1(p3−1)……pnkn−1(pn−1)&#xff0c;ϕ(j2)p12k1−1(p1−1)p22k2−1(p2−1)p32k3−1(p3−1)……

#2989. 数列(cdq分治/曼哈顿距离)

#2989. 数列 给定一个长度为n的正整数数列a[i]。 定义2个位置的graze值为两者位置差与数值差的和&#xff0c;即graze(x,y)|x-y||a[x]-a[y]|。 2种操作&#xff08;k都是正整数&#xff09;&#xff1a; 1.Modify x k&#xff1a;将第x个数的值修改为k。 2.Query x k&#xff…

通过Blazor使用C#开发SPA单页面应用程序(4) - Ant Design

通过Blazor使用C#开发SPA单页面应用程序(1)通过Blazor使用C#开发SPA单页面应用程序(2)通过Blazor使用C#开发SPA单页面应用程序(3)前面学习了Blazor的特点、环境搭建及基础知识&#xff0c;现在我们尝试的做个实际的组件。Ant Design是蚂蚁金服是基于Ant Design设计体系的 UI 组…

POJ 1741 Tree(点分治)

POJ 1741 Tree 思路 男人八题中的一题&#xff0c;写完这题算是18\frac{1}{8}81​个男人了&#xff01; 这题是树上距离的计数问题&#xff0c;能够通过巧妙地排序加双指针来解决&#xff0c; 统计距离应该大家都会地&#xff0c;我就来说明一下如何计数吧。 假设我们已经求…

P1975 [国家集训队]排队(三维偏序)

P1975 [国家集训队]排队 查询逆序对数目&#xff0c;交换两个数的位置 首先逆序对是一个经典的二维偏序问题&#xff0c;然后现在问题变为静态&#xff0c;我们可以使用三维偏序来处理多出来的限制。或者也可以使用带修主席树处理。

Mercurial黄昏,Bitbucket宣布全面转向Git

源代码托管平台 Bitbucket 宣布将逐步放弃对版本控制系统 Mercurial 的支持。Bitbucket 推出于 2008 年&#xff0c;当时集中式版本控制是比较普遍的&#xff0c;Mercurial 是其中的典型代表&#xff0c;但是当前 Git 才是主流&#xff0c;它已经成为了大部分开源项目的首选版本…

HDU 4812 D Tree (点分治) (2013ACM/ICPC亚洲区南京站现场赛)

HDU 4812 D Tree 思路 点对距离相等并且要求输出字典序最小的点对&#xff0c;距离相等不就是点分治裸题了嘛&#xff0c; 照着这个思路出发我们只要记录下所有点对是满足要求的&#xff0c;然后再去找字典序最小的点对就行了&#xff0c; 接下来就是考虑如何求最小点对了&…