ことばがありあまれどなお、 このゆめはつづいてく|

trsins

园龄:3年10个月粉丝:18关注:2

【学习笔记】数论函数与莫比乌斯反演

一. 数论函数基础

数论函数:满足值域为整数的函数。

本文下述的数若无特殊说明均为整数。

若无特殊说明则钦定
n=i=1kpiei,piPP 表示质数集合,pi 互不相同。

介绍几个常见的数论函数:

I(n)恒等函数,无论 n 是多少,其永远等于 1

ϵ(n)元函数,当 n=1 是值为 1,否则为 0。它是狄利克雷卷积的单位元

id(n)单位函数,无论 n 是多少,其值永远等于 n

φ(n)欧拉函数,表示小于 n 的整数中与 n 互质的数的个数。

μ(n)莫比乌斯函数,定义后文讲述。

积性函数

定义:对于函数 f,若 nm(即 n,m 互质)时有 f(nm)=f(n)f(m),则函数 f积性函数

完全积性函数:对于函数 f,有任意整数 n,mf(nm)=f(n)f(m)

显然 I(n),ϵ(n),id(n) 都是完全积性函数

显然完全积性函数是积性函数中的一种。

积性函数 f 有很多特殊性质:

  • f(1)=1

  • f(n)=i=1kf(piei)

二. 欧拉函数

欧拉函数 φ(n) 是积性函数且不是完全积性函数。

证明欧拉函数 φ 是积性函数

知乎上这个问题有许多清晰的解法。这里给出其中一种。

首先证明一个重要定理:φ(n)=ni=1k(pi1pi)

1n 中与 n 至少有 i 个相同质数因子的数有 Fi(n) 个。

显然 F0(n)=n

F1(n)=i=1knpi

F2(n)=1i<jknpipj

以下同理。

考虑容斥原理,得

φ(n)=i=0k(1)iFi(n)=n(1i=1k1pi+1i<jk1pipj)

容易发现式子即 φ(n)=ni=1k(pi1pi)

有此定理后证明 φ(n) 是积性函数不难。

nmn=i=1kpiei,m=i=1kqiEi

φ(n)=ni=1k(pi1pi),φ(m)=mi=1k(qi1qi)

φ(nm)=nmi=1k(pi1pi)i=1k(qi1qi)=nmp|nmp1p=φ(n)φ(m)

证毕。

欧拉函数的一些定理:

  • φ(n)=ni=1k(pi1pi)

此定理等同于:φ(n)=pk||npk1(p1)

  • φ(p)=p1,pP

  • n 为奇数,φ(2n)=φ(n)

  • φ(i×pj)={φ(i)φ(pj)pjiφ(i)pjpji

  • n=d|nφ(d)

三. 狄利克雷卷积

对于两个数论函数 f(n),g(n),其狄利克雷卷积写作 (fg)(n),其中 fg 可以看作是函数名称。

定义:(fg)(n)=d|nf(d)g(nd)

显然狄利克雷卷积满足交换律、结合律、分配律。

  • 积性函数的狄利克雷卷积也是积性函数

f,g 为积性函数,h(n)=d|nf(d)g(nd)

n,m,nm

h(n)h(m)=a|nf(a)g(na)b|mf(b)g(mb)=anbmf(a)f(b)g(na)g(mb)

nm,a|n,b|m,ab

ab,{a:an}{b:bm}={d:dnm}

h(n)h(m)=a|nb|mf(ab)g(nmab)=d|nmf(d)g(nmd)=h(nm)

证毕。

  • 积性函数的逆也是积性函数

逆:当 fg=ϵf,g 互逆。

f 为积性函数,欲证 nm,g(nm)=g(n)g(m)

考虑数学归纳法。

  1. nm=1

g(1)=1,显然成立。

  1. nm>1

钦定当 nm<nm 时结论成立。

g(nm)=d|nmf(d)g(nmd)dnm,d1f(d)g(nmd)=ϵ(nm)dnm,d1f(d)g(nmd)=d|nm,d1f(d)g(nmd)=a|n,b|m,ab1f(ab)g(nmab)=a|n,b|m,ab1f(a)f(b)g(na)g(mb)=f(1)f(1)g(n)g(m)a|n,b|mf(a)f(b)g(na)g(mb)=g(n)g(m)(a|nf(a)g(na))(b|mf(b)g(mb))=g(n)g(m)ϵ(n)ϵ(m)=g(n)g(m)

证毕。

四. 莫比乌斯反演

定义 I1I 的逆)是 μ

那么若有 g=fI,得 f=gμ

将其换一种写法,即得:

  • 莫比乌斯反演:若 g(n)=d|nf(d),有 f(n)=d|ng(d)μ(nd)。反之亦然。

那么考虑如何求出 μ(n)

由于 μI 的逆,而 I 是积性函数,所以 μ 也是积性函数。

显然得出 μ(pk)={1k=01k=10k>1

推广到一般数上,得:莫比乌斯函数 μ(n)={1n=10i[1,k],ei>1(1)kotherwise

通过莫比乌斯反演有许多结论:

  • I(n)=d|nϵ(d)ϵ(n)=d|nμ(d)

  • id(n)=d|nφ(d)φ(n)=d|nμ(nd)d

  • φ(n)I(n)=id(n)

  • 倍数莫比乌斯反演:若 g(n)=n|df(d),有 f(n)=n|dg(d)μ(dn)

定义 (fg)(n)=n|df(d)g(dn),易得 (fg)h=f(gh)

那么 f=(μI)f=μ(Ig)=μg

五. 数论分块

i=1nk%i

显然 k%i=kiki

考虑一个问题:求 i=1nf(i)ni。(f(i) 为某数论函数)

显然 ni 只有 2n 种不同取值。

那么有 O(n) 个块,对于每个块中所有数都相同。考虑对于同一块中两个数 ninjj 的最大值是 nni。(也就是块长。)

所以对于一个块知道左端点就可以求出右端点。

而对于块 [l,r] 贡献显然是 i=lrf(i)nl

对于 f(i) 处理一个前缀和即可。

六. 莫反具体应用

1i,jngcd(i,j)P 的数对 (i,j) 个数。


i=1nj=1n[gcd(i,j)P]=kPi=1nkj=1nkϵ(gcd(i,j))将 i,j 除以 gcd 后枚举gcd=kPi=1nkj=1nkd|gcd(i,j)μ(d)莫比乌斯反演=kPd=1nkμ(d)i=1ndkj=1ndk1=kPd=1nkμ(d)ndk2=t=1nk|t,kPμ(tk)nt2t 表示dk=t=1nnt2k|t,kPμ(tk)

然后对于 k|t,kPμ(tk) 设其等于 f(t),那么 f(t) 可以在 O(nlnn) 内预处理。

而 $\displaystyle \sum_{t=1}n\left\lfloor\frac{n}{t}\right\rfloor2 $ 使用数论分块 O(n)

#include <bits/stdc++.h>
using namespace std;

#define int long long

const int N=1e7+8;

int n,s[N],p[N],mu[N],ans,cnt;
bool vis[N];

inline void init(){
	mu[1]=1;
	for(int i=2;i<=n;i++){
		if(!vis[i]){
			p[++cnt]=i;
			mu[i]=-1;
		}
		for(int j=1;j<=cnt,i*p[j]<=n;j++){
			vis[i*p[j]]=1;
			if(i%p[j]==0)break;
			mu[i*p[j]]=-mu[i];
		}
	}
	return;
}

signed main(){
	scanf("%lld",&n);
	init();
	for(int i=1;i<=cnt;i++)for(int j=1;j*p[i]<=n;j++)s[j*p[i]]+=mu[j];
	for(int i=2;i<=n;i++)s[i]+=s[i-1];
	for(int i=1;i<=n;i++){
		int l=i,r=(n/(n/l));
		ans+=(s[r]-s[l-1])*(n/l)*(n/l);
		i=r;
	}
	printf("%lld",ans);
	return 0;
}

对于给出的 n 个询问,每次求有多少个数对 (x,y),满足 axbcyd,且 gcd(x,y)=k


首先考虑一个弱化问题:将 a,c 变为 1。设此答案为 F(b,d)

那么答案显然为 F(b,d)F(b,c1)F(a1,d)+F(a1,c1)

那么问题转化为求 i=1nj=1m[gcd(i,j)=k]

那么这个也就是类似上一题。

d(x)x 的约数个数,给定 n,m,求

i=1nj=1md(ij)


显然有个公式 d(ij)=x|iy|jϵ(gcd(x,y))

所求即为 i=1nj=1nx|iy|jϵ(gcd(x,y))=i=1nj=1mnimjϵ(gcd(i,j))

那么设 f(x)=i=1nj=1mnimj[gcd(i,j)=x],g(x)=x|df(d)

答案即为 f(1)

g(x)=i=1nj=1mnimjx|d[gcd(i,j)=d]=i=1nj=1mnimj[xgcd(i,j)]=i=1nxj=1mxnixmjx

根据倍数莫比乌斯反演,有 f(x)=x|dg(d)μ(dx)

f(1)=dg(d)μ(d)

注意到当 d>ng(d)0,所以 d 枚举到 n

f(1)=d=1ng(d)μ(d)

g(x) 使用数论分块做完。

//O(2)
#include <bits/stdc++.h>
using namespace std;

#define int long long

const int N=1e5;

int T,n,m,s[N],p[N],mu[N],cnt,k,ans;
bool vis[N];

inline void init(){
	mu[1]=1;
	for(int i=2;i<N;i++){
		if(!vis[i]){
			p[++cnt]=i;
			mu[i]=-1;
		}
		for(int j=1;j<=cnt,i*p[j]<N;j++){
			vis[i*p[j]]=1;
			if(i%p[j]==0)break;
			mu[i*p[j]]=-mu[i];
		}
	}
	for(int i=1;i<N;i++)mu[i]+=mu[i-1];
	for(int i=1;i<N;i++){
		int res=0;
		for(int I=1,j;I<=i;I=j+1){
			j=i/(i/I);
			res+=(j-I+1)*(i/I);
		}
		s[i]=res;
    }
	return;
}

signed main(){
	init();
	scanf("%lld",&T);
	while(T--){
		scanf("%lld%lld",&n,&m);
		if(n>m)swap(n,m);
		for(int i=1;i<=n;i++){
			int l=i,r=min(n/(n/i),m/(m/i));
			ans+=(mu[r]-mu[l-1])*s[n/l]*s[m/l];
			i=r;
		}
		printf("%lld\n",ans);
		ans=0;
	}
	return 0;
}

本文作者:trsins

本文链接:https://www.cnblogs.com/trsins/p/17970747

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   trsins  阅读(31)  评论(0编辑  收藏  举报
历史上的今天:
2022-01-17 【做题记录】Ynoi2018 天降之物
2022-01-17 【学术】连分数
2022-01-17 【做题记录】Ynoi2015 盼君勿忘
2022-01-17 【做题记录】BJOI2016 水晶
2022-01-17 【做题记录】P4965 薇尔莉特的打字机
2022-01-17 【做题记录】POI2011 Lightning Conductor
2022-01-17 【做题记录】CF961G Partitions
点击右上角即可分享
微信分享提示