数论相关

数论相关

积性函数

推论1:积性函数 f 一定满足 f(1)=1

推论2:通过质数点值可以唯一确定完全积性函数,因为质数可以组成所有的数;通过所有 pk 处的点值可以唯一确定积性函数,因为积性函数有前置条件 nm 所以要组合出有多个质因子 p 的数就需要 pk 处的点值。

Dirchlet 卷积

(fg)(n)=xy=nf(x)f(y)

Dirchlet 卷积有类似于乘法的性质:

  1. 交换律

  2. 结合律

  3. 单位元,即 ϵ(n)=[n=1]

  4. 两个积性函数的 Dirchlet 卷积依旧是积性函数。

  5. 积性函数的 Dirchlet 逆依旧是积性函数。

计算

Dirchlet卷积可以直接计算,复杂度就是调和级数 O(nlogn)

Dirchlet逆依旧可以直接计算:

有函数 f,需要求出 g 满足 fg=ϵ

那么显然就有 f(1)g(1)=1,则 g(1)=1f(1)。当 n2 时,则有

(fg)(n)=d|nf(d)g(n/d)=0g(n)f(1)=d|n,d1f(d)g(n/d)g(n)=1f(1)d|n,d1f(d)g(n/d)

常用数论函数

ϵ(n)=[n=1]

idk(d)=dk

σk(n)=d|ndk

μ(n)

φ(n)

性质;

μ1=ϵ

φ1=id

μid=φ (这个可以拿前两个推)

11=d

1idk=σk

莫比乌斯反演

f(n)=d|ng(d)g(n)=d|nf(d)μ(n/d)

证明很简单:

f=g1g1μ=g=fμ

联系子集反演:

fS=TSg(T)gS=TS(1)|S||T|fT

我们知道 s 是一个集合,而 d 可以看作是所有质因子的多重集,所以二者很相似,我们可以这样理解,如果 n=p,也就是所有质因子质数为1,那么就和子集反演完全等价,就可以理解 (1)|S||T|=μ(n/d)

整除分块

这个很牛,考虑一个问题,我们固定一个不变 n,那么所有的 nx 有多少种取值?

答案是 O(n) 种,证明:

xn 时,显然有 O(n) 种,因为 x 只有 n 个。

x>n 时,因为 nxn ,所以也只有 O(n) 种。

那么 nx 的取值就是若干个颜色段,只要我们可以 O(1) 的求出边界是多少,那么就可以 O(n) 的算出 nx

现在我们知道一个颜色段的左端点 l,考虑设右端点为 r,那么就有:

nlnrrnnl

所以 r=nnl

多维形式

也就是有多维,以两维为例,我需要求 nimi,分析一下发现颜色段还是 O(n) 级别,如果维数过大,那么就是 O(kn) 。我们每次 rmin(nnl,mml)即可。

筛法

线性筛

μφ

φ(n)=np1p

μ(n)={0,(1)k,

我们就考虑线性筛时的两种情况:

  1. i%p0 时,那么对于 φ 就是用积性函数性质 φ(ip)=φ(i)φ(p)=φ(i)(p1), 对于 μ 就是多了一个不同质因子 μ(ip)=μ(i)

  2. i%p=0时,我们用上面 φ 的公式就发现 φ(ip)=φ(i)p,对于 μ(ip) 就直接变成 0

筛一般的积性函数

由前面推论2我们知道,题面肯定会给在 p 或者 pk 的点值,这个点值的计算我们姑且声称他的时间复杂度为 O(logn)。那我们怎么用线性筛筛出所有的呢?

我们知道线性筛是用最小质因子来筛的,那么设 n=p0k0piki,我们钦定 p0 为最小质因子,m=piki,那么我们用 p0n 的时候就可以 f(n)=f(m)f(p0k0),我们就只需要知道最小质因子的次数,这在线性筛的过程中就可以做到,很简单。

杜教筛

杜教筛是比较基础的亚线性筛法。 可以在低于线性的复杂度筛出积性函数的前缀和。

我们现在除了化式子拆掉 ,能加速求和的就只有整除分块了,所以我们需要构造出来跟除法有关,尝试用 Dirchlet 卷积,若我们现在要求 f,所以我们需要构造一个 g,通过 g 来求出 f,一个方法就是卷积起来在拆开,我们尝试化一下式子。

i=1n(fg)(i)=i=1nd|ig(d)f(i/d)=d=1ng(d)d|if(i/d)=d=1ng(d)i=1n/df(i)i=1nf(i)=(i=1n(fg)(i))d=2ng(d)i=1n/df(i)

观察到 i=1n/df(i) 只有 O(n) 个取值,g 是我们所构造的,如果我们能构造出容易计算的 gfg,那么就可以快速算出答案。

方便描述,我们成全体 Sf(n/x)f 的基本和组。

可以分析得出时间复杂度 O(n34),并且如果可以,可以 O(n) 筛出前 n23 项,大于 n23 的就递归计算。

上面的是已知 fg 的基本和组和 g 的基本和组,求 f 的基本和组。

如果我们已知 fg 的基本和组,我们一样可以类似杜教筛的求 fg 的基本和组。

i=1n(fg)(i)=i=1nd|ig(d)f(i/d)=d=1ng(d)d|if(i/d)=d=1ng(d)i=1n/df(i)

直接拿这个算和上面本质相同。

我们还有另外一个方法。

狄利克雷双曲线法

我们用一下简单的容斥。

i=1n(fg)(i)=xynf(x)g(y)

注意到 xyn 是一个双曲线,我们可以这样容斥,如图。

这是一个双曲线,我们把所有的 f(x)g(y) 看作点 (x,y),那么蓝色部分就是 yn 的点集,红色部分就是 xn 的点集,相交部分就是同时满足两个条件的。

所以我们可以算出蓝色部分和红色部分再减去相交的部分,用式子表述就是:

Sf(n)=xnf(x)Sg(n/x)+yng(x)Sf(n/x)Sf(n)Sg(n)

这个东西复杂度没有变化,但是听说常数比较小。感觉上也更妙一些。。。

Powerful Number 筛

这个东西要暴力一些,比杜教筛更现代。 而且更快。

posted @   qqrj  阅读(14)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示