莫比乌斯反演 & 杜教筛 模板

前记:

突然想学杜教筛,顺便复习莫比乌斯反演。

P 表示质数集。

0.前置

.1 积性函数

对于任意互质的整数 ab 有性质 f(ab)=f(a)f(b) 的数论函数叫做积性函数。

.2 狄利克雷卷积

定义:

对于两个数论函数 f(x),g(x),它们的狄利克雷卷积结果 h(x) 为:

h(x)=dxf(d)g(xd)。记为 h=fg

定义函数 1(x)=1,id(x)=x,ε(x)=[n=1]

则:

f1=dxf(d)1=dxf(d)

fid=dxf(d)xd

fε=dxf(d)[d=x]=f,所以 ε 被称作单位元,即对于任何数论函数 ffε=f

性质:

  1. 狄利克雷卷积满足交换律,结合律与分配律。

  2. 两个积性函数的狄利克雷卷积也是积性函数。

  3. 积性函数的逆元也是积性函数。

证明皆略。

.3 欧拉函数

定义:

对正整数 x,欧拉函数 φ(x) 表示小于(或小于等于)x 的正整数中与 x 互质的数的数目。特别规定 φ(1)=1。即:

φ(x)={1x=1i=1x(ix)x>1

显然: φ(x)=x1xP

性质:

  • 性质 1. 若 pPφ(pn)=pn1(p1)

不大于 pn 的正整数中,不与之互质的只有 p,2ppn1p,共 pn1 个数,所以 φ(pn)=pnpn1=pn1(p1)

  • 性质 2. 若 axφ(ax)=aφ(x)

易得。

  • 性质 3. φ 为积性函数。

证明显然。由于是积性函数,所以根据以上性质与欧拉筛结合,则:

φ(x)={x1xPaφ(xa)xP,axa(a1)φ(xa)xP,axa

inline void init(int n)
{
	phi[1]=1;
	for(register int i=2;i<=n;++i)
	{
		if(!phi[i]) phi[i]=i-1,p[++tot]=i;
		for(register int j=1;j<=tot;++j)
		{
			if(i*p[j]>n) break;
			if(!(i%p[j])){phi[i*p[j]]=p[j]*phi[i];break;}
			phi[i*p[j]]=(p[j]-1)*phi[i]; 
		}
	}
	return ; 
}
  • 性质 4. φ1=id

将正整数 x 质因数分解为 i=1kpici

因为 φ 是积性函数,所以只要证明 x=pcφ1=id 即可,所以:

(φ1)(n)=dnφ(nd)=i=0cφ(pi)=1+(p1)i=0c1pi=pc=n=id(n)

1.莫比乌斯反演

.1 莫比乌斯函数

定义:

将正整数 x 质因数分解为 i=1kpici。定义 μ

μ(x)={1n=10i[1,k],ci>1(1)ki[1,k],ci1

实际含义为若 x 含有平方因子则 μ(x)=0,否则若包含奇数个不同质因数则 μ(x)=1,偶数个则 μ(x)=1。特别规定 μ(1)=1

性质:

  • 性质 1:μ 是积性函数。

证明显然。

由于 μ 是积性函数,可以使用欧拉筛筛出。对于大于 1 的正整数 x,设 ax 的一个质因数。则:

μ(x)={1xP0xP,axa1μ(xa)xP,axa

inline void init(int n)
{
	mu[1]=1;
	for(register int i=2;i<=n;++i)
	{
		if(!flag[i]) p[++tot]=i,mu[i]=-1;
		for(register int j=1;j<=tot&&i*p[j]<=n;++j)
		{
			flag[i*p[j]]=true;
			if(!(i%p[j])){mu[i*p[j]]=0;break;}
			mu[i*p[j]]=-mu[i];
		}
	}
	return ;
}
  • 性质 2:μ1=ε

n=i=1kpici,n=i=1kpi,则 dnμ(d)=dnμ(d)=i=0k(ki)(1)i

根据二项式定理有:

dnμ(d)=i=0k(ki)(1)i=(1+(1))k=[n=1]=ε(n)

  • μ1=ε

延伸一下,有:

[gcd(i,j)=1]=ε(gcd(i,j))=dgcd(i,j)μ(d)

  • [ij]=dgcd(i,j)μ(d)

结合 φ1=id 可得:

idμ=φ1μ=φε=φ

  • μid=φ

{μ1=εφ1=idμid=φ

.2 莫比乌斯变换

对于 f(n),g(n) 两个数论函数,如果有 f=g1,则有 g=fμ。这样,f(n) 称为g(n) 的莫比乌斯变换,g(n) 称为 f(n) 的莫比乌斯反演。

证明较为简单:f=g1fμ=g1mu=gε=g

所以事实上 φμ 的关系只是 f=id,g=φ 的一组特例。

扩展:f(n)=i=1nt(i)g(ni)g(n)=i=1nμ(i)t(i)f(ni)感觉证明好复杂,但是形式貌似很好背,不学证明了。

2.杜教筛

.1 杜教筛

杜教筛是一种用来求解数论函数的前缀和的算法,可以在低于线性时间内计算 s(n)=i=1nf(i)

对于一个数论函数 g,恒有:

i=1n(fg)(i)=i=1ndig(d)f(id)=i=1nj=1nig(i)f(j)=i=1ng(i)S(ni)=g(1)S(n)+i=2ng(i)S(ni)

这样我们就得到了含有 S(n) 的项,移项得:

g(1)S(n)=i=1n(fg)(i)i=2ng(i)S(ni)

也就是现在问题要求找到一个 g ,使得 (fg) 的前缀和与 g 可以被快速的计算出。

.2 杜教筛实例

欧拉函数前缀和:

φ1=id 想到使 g=1,原式化为:

S(n)=i=1nii=2nS(ni)=n(n+1)2i=2nS(ni)

莫比乌斯函数前缀和:

μ1=ε 想到使 g=1,原式化为:

S(n)=i=1n[i=n]i=2nS(ni)=1i=2nS(ni)

φid 前缀和:

g=id,则:

S(n)=i=1ndi(dφ(d))idi=2niS(ni)=i=1nidiφ(d)i=2niS(ni)=i=1ni(φ1)(i)i=2niS(ni)=i=1niid(i)i=2niS(ni)=n(n+1)(2n+1)6i=2niS(ni)

上面三个要用到数论分块,所以经过一堆复杂的我不想推导的时间复杂度的推导,将 n23 的数常规线筛出来预处理时间复杂度最优,为 O(n23)


后记:

srds,是不是还应该去学 SoyTony 筛。

srds,还是除了板题啥也不会。

posted @   int_R  阅读(115)  评论(11编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示