P6222-「P6156 简单题」加强版【莫比乌斯反演】

1|0正题

题目链接:https://www.luogu.com.cn/problem/P6222


1|1题目大意

给出kT组询问给出n

i=1nj=1n(i+j)k×gcd(i,j)×μ(gcd(i,j))2


1|2解题思路

开始忘记了k次幂能线性筛后面全推错了,既然可以线性筛k次幂就把gcd(i,j)提到前面来。

d=1nμ(d)2di=1nj=1n[gcd(i,j)=d](i+j)k

这里有一个比较巧妙的思路就是,可以把μ(d)2d提前莫反之后一起套进莫反里。
设有

d|ng(d)=μ(n)2ng(n)=d|nμ(nd)μ(d)2d

然后莫反原式就有一个比较简单的式子了

d=1ng(d)dki=1ndj=1nd(i+j)k

S(n)=i=1nj=1n(i+j)k,这个东西是可以线性预处理的。

先预线性筛+前缀和处理出s(n)=i=1nik,就有S(n)=(i=n+12ns(i))(i=1ns(i)),再用一个前缀和就好了。

然后就有式子

d=1ng(d)dkS(nd)

这个知道怎么筛g(d)dk之后好像就可以O(Tn)做了?发现g里面有个n还是很难搞。
然后可以一顿操作把下取整搞掉,设S(x)=S(x)S(x1),那么就有

d=1ng(d)dki=1ndS(i)

然后把i提出来就有

i=1nd|ig(d)dkS(nd)

然后就会发现这是两个函数狄利克雷卷积的前缀和?
f(n)=g(n)nk=nkd|nμ(nd)μ(d)2d是积性函数,所以我们可以用埃氏筛的方法来快速搞这个东西。

首先我们需要知道对于一个质数pf(pe)如何快速计算。
这里是有结论的

  • e=0f(p0)=f(1)=1
  • e=1f(p1)=p×(1×μ(1)2μ(p)+p×μ(1)μ(p)2)=p(p1)
  • e=2f(p2)=p2×(μ(p2)μ(1)2+μ(p)μ(p)2p+μ(1)μ(p2)2p2)=p2
  • e3那么若μ(d)0那么一定有μ(nd)=0,所以f(pe)=0

然后就可以开始做了,怎么快速计算狄利克雷卷积?埃氏筛给过我们方法,对于一个积性函数f,我们可以拆成若干个fp满足

fp(x)=[pe=x]f(x)  (pPri)

Pri是质数集)

然后有f=pPrifp(乘法表示狄利克雷积)

所以把所有的fp乘到S里去就好了,这个是枚举所有质数的倍数来搞的,时间复杂度O(nloglogn)

所以总共的时间复杂度就是O(T+nloglogn)


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #define uit unsigned int using namespace std; const int N=2e7+10; int t,n,k,cnt; uit pri[N],pw[N],s[N]; bool v[N]; uit power(uit x,int b){ uit ans=1; while(b){ if(b&1)ans=ans*x; x=x*x;b>>=1; } return ans; } void init(){ s[1]=1; for(int i=2;i<=n*2;i++){ if(!v[i])pri[++cnt]=i,s[i]=power(i,k); for(int j=1;j<=cnt&&i*pri[j]<=n*2;j++){ v[i*pri[j]]=1;s[i*pri[j]]=s[i]*s[pri[j]]; if(i%pri[j]==0)break; } } for(int i=1;i<=n*2;i++) pw[i]=s[i],s[i]=s[i-1]+s[i]; for(int i=1;i<=n;i++) s[i]=s[i*2]+s[i*2-1]-s[i]*2; for(int j=1;j<=cnt&&pri[j]<=n;j++) for(int x=pri[j],i=n/x;i>=1;i--){ s[i*x]+=s[i]*(x-1)*pw[x]; if(i%x==0)s[i*x]-=s[i/x]*x*pw[x]*pw[x]; } for(int i=1;i<=n;i++)s[i]+=s[i-1]; return; } int main() { scanf("%d%d%d",&t,&n,&k); init(); while(t--){ scanf("%d",&n); printf("%u\n",s[n]); } return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/14308758.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(83)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示