筛子与莫反

1. Miller-Rabin

Miller-Rabin 是一种接受随机性的正确性较高的素数检验方法,它有一定概率将合数判断为素数,但不会将素数判断为合数。

其基本判定思路是,检测素数都具有但合数不具有的特殊性质,如众所周知的费马小定理 xp11(modp)

1.1 费马素性检验

费马小定理的逆定理:xp11(modp)pPrime 并不恒成立,例如当 x=2,p=341=1131,有 23401(mod341),我们称这一类通过费马素性检测的合数为伪素数,其中 341 是最小的伪素数。

我们可以多随机几个 x 进行检测,全部通过才为素数。但是有一类卡迈克尔数 y,满足任意 xy,xy11(mody),这样我们就很难随机出排出他们的答案。(即使这一类数在 108 内只有 255 个)

1.2 二次探测定理

根据二次剩余,我们有 x21(modp),有解当且仅当 x=±1(modp)。这启发我们用于改进朴素的费马素性检测。

我们先随便找一个素数作为底数 a,检测 ap1,因为 p2,所以可以不断除以 2,直到得到一个 p 为奇数,由二次探测定理可知这个过程中相当于不断开根号,所得到的结果一定是 ±1,如果不是,则一定是合数。我们一直检测到 p 为奇数或者 0 即可。

如果我们选择前 12 个质数可以检测所有在 278 内的质数和合数,具体的可见 [OEIS](A014233 - OEIS),复杂度 O(klog2)k=12

2. 积性函数与狄利克雷卷积

积性函数:满足 f(ab)=f(a)f(b),ab,有拓展:f(pici)=f(pici)

完全积性函数:不要求互质。

常见的积性函数:

  • 单位函数 ϵ(n)=[n=1]。当且仅当 n=1 取值为 1,它是完全积性函数。
  • 常数函数 I(n)=1。完全积性。
  • 恒等函数 id(n)=n,完全积性。
  • 约数函数 σk(n)=d|ndk,当 k=0σ0(n) 为约数个数 d(n),当 k=1σ1(n) 为约数和。
  • 欧拉函数 φ(n)=[in],即与 n 互质的数的个数。
  • 莫比乌斯函数 μ(n)={1n=10d>1,d2n(1)ω(n)otherwise

另外的,还有加性函数 f(ab)=f(a)+f(b),ab,例如:本质不同因子个数函数 ω(n)=pP[p|n],近似可认为 ω(n)=lgn

狄利克雷卷积:

fg=h,hi=d|ifdgi/d

狄利克雷前缀和:给定 an,求 bn=i|nai

实际就是数论意义上的高维前缀和,将每个素数作为维度。复杂度 O(nloglogn)

for(int i=1;i<=cnt;i++) {
    for(int j=1;j<=n&&prime[i]*j<=n;j++) {
        a[prime[i]*j]+=a[j];
    }
}

卷积恒等式:

  • fϵ=f

  • φI=iddφ(d)=n

  • μI=ϵ

    • n=piki,n=pid|nμ(d)=d|nμ(d)=i=0k(ki)(1)i=(11)k=[n=1]=ϵ

  • μid=φ

  • g=fIf=gμ

3. 数论分块

i=1nf(i)g(ni)

前提:f 的前缀和可快速计算。

感性认知:使得 ni=k 的正整数 i 范围为 (nk+1,nk]

结论1:对于任意 i[1,n],不同的 ni 只有 2n 个。

我们枚举整除值 d,求出最小和最大的 i 使得满足条件,分别记作 l,r,都可以通过感性认知算。那么原式可写作 dg(d)i=lrf(i),后者前缀和计算。

如何跳过极长的等价 i 的连续段,r=(n/(n/l)),均为下取整。

转换

i=1nkmodi=i=1nkki×i=nki=1nki×i

后面再用等差数列求和。

例题

P2260 [清华集训2012] 模积和

ans=i=1nj=1m(nmodi)×(mmodj),ij=i=1nj=1m(n)

P3579 [POI2014] PAN-Solar Panels

4.莫比乌斯反演

[gcd(i,j)=1]=d|gcd(i,j)μ(d)φ(n)=d|ndμ(nd)

常见技巧

(1)i=1nj=1m[gcd(i,j)=1]=i=1nj=1md|gcd(i,j)μ(d)=d=1min(n,m)i=1n/dj=1m/dμ(d)=d=1min(n,m)μ(d)ndmd

神秘技巧

(1)d(ij)=x|iy|j[gcd(x,y)=1]

证明(1):因为左右两边都是积性函数,所以只需要考虑只有一个质因子的情况即可,设 ij=pk,其中 i=pk1,j=pkk1,那么 d(ij)=k1+1,考虑等号右边,gcd=1 要求了两个数至少有一个为 1,若 i=1kk1+1 的贡献,j=1k1+1 的贡献,再减去算重的两个都是 1 的情况,最终答案 k+1。应用在[SDOI2015] 约数个数和

(2)σ1(ij)=x|iy|j[gcd(x,y)=1]ixy

入门例题

[HAOI2011] Problem b

gcd(x,y)=k,x[a,b],y[c,d] 的个数。

先二维差分转换为下界为 1 的情况处理:

xnym[gcd(x,y)=k]=xn/kym/d[gcd(x,y)=1]=xyd|gcd(x,y)μ(d)=d=1min(n,m)μ(d)n/kdm/kd

然后需要进行整除分块。

P2398 GCD SUM

injngcd(i,j)=ijd|gcd(i,j)d[gcd(i,j)=d]=d|ndin/djn/de|gcd(i,j)μ(e)=d|nde|(n/d)μ(e)(n/(de))2=D=1ndd×μ(D/d)×(n/D)2=D=1nφ(D)×(n/D)2

实际上这完全是莫反学傻了,对于 id 类的求和,我们有欧拉反演:

injngcd(i,j)=injnd|gcd(i,j)φ(d)=dφ(d)×(n/d)2

P1891 疯狂 LCM

i=1nlcm(i,n)=i=1ni×ngcd(i,n)=ni=1nd|gcd(i,n)id[gcd(i,n)=d]=nd|ni=1n/di[gcd(i,n/d)=1]=nd|nf(n/d)f(x)=i=1xi[gcd(i,x)=1]=i=1xid|gcd(i,x)μ(d)=d|xμ(d)i=kdi=d|xμ(d)(d+x)(x/d)2=d|xμ(d)x2+x22d=x2d|xμ(d)(1+xd)=x2μ1+μid=x2μ1+μ1φ=x2(ϵ+φ)

至此,可以做到 O(Tn) 求,继续展开可以做到 O(n)

ans=nd|nn/d2([d=n]+φ(n/d))=12d|n(n/d)×φ(n/d)+n2

可以线性筛出 φ×id。因为两个积性函数相乘仍然是积性函数。注意这里不是卷积。

当然直接 O(nln) 暴力求也可以。

中等例题

P2257 YY的GCD

i=1nj=1m[gcd(i,j)P]=pij[gcd(i,j)=p]=pd=1μ(d)npdmpd

推不动了,仔细观察,一个常见套路是,如果分母上有两项,则将他们的乘积设出来,令 T=pd

pd=1μ(d)npdmpd=Td=1μ(d)nTmT=TnTmTp|Tμ(Tp)=TnTmTf(T)

如果我们能求出 f 的前缀和,那么就可以直接整数分块做。

考虑直接暴力算 f,素数个数是 O(nlnn) 的,调和级数是 O(lnn) 的,所以我们暴力就是 O(n) 的。

P3327 [SDOI2015] 约数个数和

根据神秘 trick,我们有:

d(ij)=x|iy|j[gcd(x,y)=1]ans=i=1nj=1mx|iy|jd|gcd(x,y)μ(d)=dμ(d)x=1ny=1mnxmy[gcd(x,y)=d]=dμ(d)x=1n/dy=1m/dndxmdy=d=1μ(d)(x=1ndndx)(y=1mdmdy)

至此,可以整除分块在 O(n) 内算出答案。

P1829 [国家集训队] Crash的数字表格

i=1nj=1mlcm(i,j)=i=1nj=1mijgcd(i,j)=i=1nj=1mdijd[gcd(i,j)=d]=di=1n/dj=1m/dijd[gcd(i,j)=1]=di=1n/dj=1m/dijdt|gcd(i,j)μ(t)=d=1di=1n/dj=1m/dijt|gcd(i,j)μ(t)=d=1d×f(n/d,m/d)f(n,m)=i=1nj=1mijt|gcd(i,j)μ(t)=t=1μ(t)i=1n/tj=1m/t(ijt2)=t=1μ(t)t2×(i=1n/ti)(j=1m/tj)=t=1μ(t)t2×(1+n/t)(n/t)/2×(1+m/t)(m/t)/2

发现两者的最后一部都可以数论分块求解,故总复杂度 O(n×n)=O(n)

P3704 [SDOI2017] 数字表格

i=1nj=1mfgcd(i,j)=d=1min(n,m)f(d)i=1nj=1m[gcd(i,j)=d]=d=1f(d)g(d)g(d)=i=1nj=1m[gcd(i,j)=d]=t=1min(n,m)/dμ(t)ntdmtd=Tμ(T/d)nTmTT=tdans=d=1f(d)μ(T/d)n/Tm/T =d=1(T|df(d)μ(Td))nT×mT

其中,T|df(d)μ(Td) 可以调和级数预处理,复杂度 O(nlnn),询问可以直接整除分块。总复杂度 O(nlnn+Tnlogn)

posted @   Apricity8211  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示