码迷,mamicode.com
首页 > 其他好文 > 详细

[知识点]莫比乌斯反演模型进阶

时间:2017-12-08 19:24:48      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:暴力   com   转化   莫比乌斯反演   ges   分块   src   block   预处理   

哪来什么进阶QAQ,只不过是被虐得更惨了

总结了一下lc传授的套路与模型

一般来讲是求与gcd有关的。那么可以反演得到模型:

令f(d)为1<=x<=n,1<=y<=m且gcd(x,y)=d的数对(x,y)的个数

然后可以枚举d进行一波操作,然后再换个元,大概可以得到

技术分享图片

通过预处理出g(x)和前缀和,分块去计算答案,以达到单次询问√n

至于这个处理g(x),我们通常用以下方法:

借鉴线性筛,分类操作

①x为质数时

②i与p互质时求i*p

③i%p==0时求i*p(此时break)

通常第三种情况我们需要使i*p=i1*py,此时i1与p互质,这样就可以转化为情况二去解决问题了

那么我们怎么求得i1以及y呢?简单粗暴可以暴力去除,最坏复杂度是O(logn)

我们还可以O(1)去求:

对于每一个数,记录它的最小质因数P[i]、它的幂K[i]、还有G[i*p]=P[i*p]K[i*p]

由于筛的时候每个数都会被它的最小质因数筛掉,所以在break之前,p为i*p的最小质因数

情况二的时候,P[i*p]=p,K[i*p]=1,G[i*p]=p

情况三的时候,由于i*p已经记录最小质因数p了,只需将K[i*p]=K[i]+1就好了,同时G[i*p]=G[i]*p

需要求情况三中的y和i1的时候,K数组里就是y,可以O(1)求出 i1=(i*p)/G[i*p]  (撒花!!)

此类型题目:

[BZOJ 3529]数表

[BZOJ 3309]DZY Loves Math

[知识点]莫比乌斯反演模型进阶

标签:暴力   com   转化   莫比乌斯反演   ges   分块   src   block   预处理   

原文地址:http://www.cnblogs.com/Hallmeow/p/8006177.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!