哪来什么进阶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] (撒花!!)
此类型题目:
时间: 2024-11-01 12:33:11