数论函数综合

一.数论函数

1.定义

数论函数是 : 其定义域是正整数,值域是一个数集的函数。

积性函数 : 对于所有互质整数 ab 有性质f(ab)=f(a)f(b)的数论函数。

完全积性函数 : 对于所有整数 ab 有性质f(ab)=f(a)f(b)的数论函数。

常见的的积性函数:

2.性质

1.对于任意正整数 n , i|nφ(i)=n

不妨令 f(n)=i|nφ(i) , 首先证明 f 是一个积性函数。

因为 n,m 互质

f(n)×f(m)=i|nφ(i)×j|mφ(j)=ij|nmφ(i)×φ(j)=ij|nmφ(ij)=f(n×m)

因为 n=p1w1×p2w2×...×pkwk , 且 f 为积性函数 , 所以只需求出 f(piwi) 即可。

f(piwi)=d|piwiφ(d)=φ(1)+φ(pi)+φ(pi2)+...+φ(piwi)=1+(pi1)+(pi2pi)+...+(piwipiwi1)=piwi

所以 f(n)=n , 即 i|nφ(i)=n

2.对于任意正整数 n , i|nμ(i)=[n=1]

证明如下:

1.当 n=1 时显然

2.当 n!=1 时,由唯一分解定理得:n=p1w1p2w2...pkwk
由莫比乌斯函数的性质,μ(k)0 当且仅当 k 无平方因子。(由多个质因子相乘)

i 个质因子的数有 Cki 种取值。

所以只需证

i=0k(1)iCki=0

很像二项式定理,将 x=1,y=1 代入即可得证。

3.对于任意正整数 nd|nμ(d)d=φ(n)n

这个一会儿再证。

二.狄利克雷卷积

两个数论函数 fg 的卷积为 t(n)=(f×g)(n)=d|nf(d)×g(nd)

前面的括号代表将 fg ,后面的括号代表范围。

简记为t=fg

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

f 是任意积性函数 , 则 fϵ=f


较为常见数论函数的迪利克雷卷积:

d=II

σ=idI

id=φI

ϵ=μI

φ=μid

其中,后三项分别对应积性函数的三个性质。

现在证一下 φ=μid

φI=idφIμ=idμφ=idμ

φ(n)=d|nndμ(d)

两边同时除以 n , 得

φ(n)n=d|nμ(d)d

就是上文提到的性质3

三.数论分块

1.引入

题目给你这样一个式子:

i=1nni

这不是暴力吗?

那如果n1012 呢?再见

这时我们就要用到一个神奇的结论——数论分块

2.思想

再看一眼式子,我们发现,很多值是一样的。

如果我们知道分布规律,那么这一段就可以一起求解了。

结论是:若一段区间的左端点为l,那么区间值为 nl ,区间右端点 r=nnl

证明如下:

k=nl,p=n mod l , 则n=kl+p

nl+d=k , 则 n=k(l+d)+p

两个式子相减得:p=pkd , 又因为 0p,pl1

所以 d 的最大值为 pk

那么,

r=l+d=l+pk=l+n mod lnl=l+nnllnl=l+nnllnl=nllnl+nnllnl=nnl

3.代码实现

for( int l = 1 , r ; l <= n ; l = r + 1 ) {
	r = n / (n / l);
	\\具体内容例题会讲到
}

数论分块大多数情况是和数论函数一起使用

4.例题

1.P2261 [CQOI2007]余数求和

题目要求的是

i=1nk mod i

i=1nkkii

nki=1nkii

然后 ,因为在 lr 区间内 ki 的值相等,i 递增,所以这段区间内是一个等差数列 ( 首项为 lki , 末项为 rki , 公差为 ki ) , 对于每一段区间计算和即可。

注意,Ans 计算的是 i=1nkii

#include <cstdio>
#include <iostream>
using namespace std;

int n , k;
long long Ans;

int main( ) {
	scanf("%d %d",&n,&k);
	for( int l = 1 , r ; l <= n ; l = r + 1 ) {
		r = k / l == 0 ? n : min( n , k / ( k / l ) );
		Ans += 1ll * ( k / l ) * ( l + r ) * ( r - l + 1 ) / 2; 
	}
	printf("%lld", 1ll * n * k - Ans );
	return 0;
} 

2.P3935 Calculating

3.P2260 [清华集训2012]模积和 & P2834 能力测验

四.莫比乌斯函数与莫比乌斯反演

1.莫比乌斯函数

由唯一分解定理得:

n=p1w1p2w2...pqwq

μ(n)={1(n=1)(1)q(wi=1)0(wi2)

通俗来讲,μ(1)=1 ,当 n 存在平方因子时 μ(n)=0

否则 μ(n)=(1)kk 为质因子数。

附一份线性筛的代码:

void sieve( int x ) {
	mu[ 1 ] = 1;
	for( int i = 2 ; i <= x ; i ++ ) {
		if( !vis[ i ] ) {
			prime[ ++ k ] = i;
			mu[ i ] = -1;
		}
		for( int j = 1 ; j <= k && 1ll * i * prime[ j ] <= x ; j ++ ) {
			vis[ i * prime[ j ] ] = 1;
			if( i % prime[ j ] == 0 ) break;
			mu[ i * prime[ j ] ] = -mu[ i ];
		}
	}
}

2.莫比乌斯反演

1.形式1

如果

F(n)=d|nf(d)

则有

f(n)=d|nμ(d)F(nd)

证法1.狄利克雷卷积

F=fI

Fμ=fIμ

Fμ=fϵ

f=Fμ

证法2.和式变化

d|nμ(d)F(nd)=d|nμ(d)s|ndf(s)=d|nf(d)s|ndμ(s)=d|nf(d)[nd=1]=f(n)

2.形式2

如果

F(n)=n|df(d)

则有

f(n)=n|dμ(d)F(dn)

1.证法1.和式变化

n|dμ(d)F(dn)=n|dμ(d)dn|sf(s)=n|df(d)dn|sμ(s)=n|df(d)[dn=1]=f(n)

2.证法2.莫比乌斯函数

n|dμ(d)F(dn)=n|dμ(dn)F(d)=n|dμ(dn)d|sf(s)

因为 d , s 分别为 n , d 倍数, 所以设 d=n×k,s=d×t,上式即为

k=1μ(k)t=1f((k×t)×n)

观察发现,对于每一个 k ,它会将所有的倍数贡献 μ(k) 个。

反过来将,对于一个f(an),它出现的次数为d|aμ(d)=[a=1]

所以只有当 a=1 时,f(1n)=f(n) 会刚好出现一次。

所以上式等于 f(n)

3.例题

1.Luogu P3455i=1nj=1m[gcd(i,j)=d]( d已知 )

题解

2.Luogu P1829i=1nj=1mlcm(i,j)

题解

3.cqbzoj P6388i=1nj=1mgcd(i,j)

题解

4.Luogu P3704i=1nj=1mfgcd(i,j) , f为斐波拉契数列。

题解

五.杜教筛

一.前言

一般来说,反演的题目都需要积性函数的前缀和,一般都能用线性筛解决。

但是,如果良心出题人将 n 出到 109 , 我们就需要使用一种非线性时间筛法。

二.推导

首先设要计算的函数为 fS 为其前缀和。

构造出两个函数 g , h , 使得 h=fg , 即 h(n)=d|nf(d)g(nd)

显然有:

i=1nh(i)=i=1nd|ig(id)f(d)=i=1ndb=ig(d)f(b)=d=1ng(d)b=1ndf(b)=d=1ng(d)S(nd)=g(1)S(n)+d=2ng(d)S(nd)

g(1)S(n)=i=1nh(i)d=2ng(d)S(nd)

这就是杜教筛的一般形式了。

3.应用

一般来讲,在杜教筛时,h 的前缀和可以快速求得 , g 的前缀和也尽量简单。

大部分是狄利克雷卷积的形式。

1.求 S(n)=i=1nμ(i)

容易想到 , μI=ϵ , 即 gI , hϵ

代入上式得:

S(n)=1d=2nS(nd)

附一份代码:

int Summu( int n ) {
	if( n <= MAXN ) return summ[ n ]; //预处理
	if( Mapm[ n ] ) return Mapm[ n ]; //记忆化
	
	int Ans = 1;
	for( int l = 2 , r ; l <= n ; l = r + 1 ) {
		r = n / ( n / l );
		Ans -= ( r - l + 1 ) * Summu( n / l ); 
	}
	return Mapm[ n ] = Ans;
}

2.求 S(n)=i=1nφ(i)

容易想到 , φI=id , 即 gI , hid

代入上式得:

S(n)=n(n+1)2d=2nS(nd)

附一份代码:

int Sumphi( int n ) {
	if( n <= MAXN ) return sump[ n ]; //预处理
	if( Mapp[ n ] ) return Mapp[ n ]; //记忆化
	
	int Ans = n * ( n + 1 ) / 2;
	for( int l = 2 , r ; l <= n ; l = r + 1 ) {
		r = n / ( n / l );
		Ans -= ( r - l + 1 ) * Sumphi( n / l ); 
	}
	return Mapp[ n ] = Ans;
}

结合 1,2 就是 P4213 【模板】杜教筛(Sum)

3.求 S(n)=i=1nφ(i)×i2

在迪利克雷卷积中,idid 会是一个非常好的式子,因为这样可以约分。

我们不妨构造函数 g(n)=n2 , 来约掉f(n)所含的n2

h(n)=d|nf(d)×g(nd)=d|nφ(d)×d2×(nd)2=n2d|nφ(d)=n3

h,g前缀和非常容易得到

i=1nh(i)=n2(n+1)24

i=1ng(i)=n(n+1)(2n+1)6

带入杜教筛的式子:

g(1)S(n)=i=1nh(i)d=2ng(d)S(nd)

S(n)=n2(n+1)24d=2ng(d)S(nd)

然后就可以做 P3768 简单的数学题

参考题解

4.求 S(n)=i=1nd(i)

首先有 d=II

容易想到 , μd=I , 即 gμ , hI

代入上式得:

S(n)=nd=2nμ(d)S(nd)

然后可以用杜教筛同步筛μd 的前缀和。

原题 P6788 「EZEC-3」四月樱花

参考资料

数论函数

莫比乌斯反演

杜教筛

posted @   chihik  阅读(487)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示