Number Theory(3)
7 数论函数基础
数论函数是数论中相当重要的一环,我们先来将一些基本的函数。
7.1 相关定义
-
数论函数:定义域为正整数的函数称为 数论函数。因其在所有正整数处均有定义,故可视作数列。OI 中常见的数论函数的陪域(即可能的取值范围)为整数。
-
加性函数:若对于任意
且 均有 ,则称 为 加性函数。注意区分代数中的加性函数。 -
积性函数:若对于任意
且 均有 ,则称 为 积性函数。容易发现 是必要条件。 -
完全积性函数:若对于任意
均有 ,则称 为 完全积性函数。完全积性函数一定是积性函数。 -
数论函数的 加法:对于数论函数
, 表示 和 对应位置相加,即 。 -
数论函数的 数乘:对于数
和数论函数 , 表示 的各个位置乘 ,即 。一般简记作 。 -
数论函数的 点乘:对于数论函数
, 表示 和 对应位置相乘,即 。为与狄利克雷卷积符号 作区分,点乘符号通常不省略。
7.2 常见函数
设
-
单位函数:
。完全积性函数。 -
常数函数:
。完全积性函数。 -
恒等函数:
。 记作 。完全积性函数。 -
除数函数:
。 表示 的约数个数,记作 或 。 表示 的约约数和,记作 。 有计算式
根据乘法分配律,
等比数列求和后即可。
-
欧拉函数:
,表示 以内与 互质的数的个数。后面我们会有所介绍。 -
本质不同质因子个数函数:
,表示 的本质不同质因子个数。 -
莫比乌斯函数:
以上所有函数除
7.3 线性筛积性函数
在前面的素数部分,我们分析了线性筛素数,它提供了在线性时间内筛出具有特殊性质的积性函数在
只要积性函数
根据积性函数的性质,只要预先求出
下面放一个框架,from Alex_Wei:
for(int i = 2; i < N; i++) {
if(!vis[i]) pr[++pcnt] = i, f[i] = ..., low[i] = i; // 单独算 f(p)
for(int j = 1; j <= pcnt && i * pr[j] < N; j++) {
vis[i * pr[j]] = 1;
if(i % pr[j] == 0) { // i 与 p 不互质
low[i * pr[j]] = low[i] * pr[j];
if(i == low[i]) f[i * pr[j]] = ...; // i = p ^ k,单独算 f(p ^ {k + 1})
else f[i * pr[j]] = f[i / low[i]] * f[low[i * pr[j]]];
break;
}
low[i * pr[j]] = pr[j];
f[i * pr[j]] = f[i] * f[pr[j]]; // i 与 p 互质,f(ip) = f(i)f(p)
}
}
8 狄利克雷卷积
钢筋混凝土。
8.1 定义与性质
两个数论函数
上面简记成
狄利克雷卷积还有一些有趣的性质。
交换律,分配律,结合律。
这三个东西都可以用定义式稍微推一下就证明出来了。
单位元:
。
逆元:若函数
满足 ,则称 互为逆元。
积性函数总是有且仅有一个逆元。
可逆当且仅当 。
下面写出证明和逆元的计算式:
设
这同时也说明了逆元的 唯一性。
的充要条件是 ,其中 。
直接乘上
积性函数的狄利克雷卷积也是积性函数。
设有两个积性函数
第二行中,由于
积性函数的逆元也是积性函数。
设有积性函数
使用归纳法。当
综合后面的两个性质,两个积性函数的积与商都是积性函数,但和与差不是。
8.2 线性筛狄利克雷卷积
给出
我们直接用定义式计算,把枚举因数变成枚举倍数,根据调和级数,时间复杂度为
如果
对于第一项和第三项,我们都可以在线性筛中总代价
如果
当
因此,
综上,使用线性筛求出两个在质数幂处取值已知的积性函数的狄利克雷卷积在
这样我们就得到了积性函数线性筛更弱的条件:可以
P6222 「P6156 简单题」加强版
给出
,多次给出 ,求
。
会用到稍后要讲的莫比乌斯反演。
枚举 gcd,再进行莫比乌斯反演
我们需要线性筛预处理出
这就需要用到我们上面讨论的线性筛狄利克雷卷积。代码。
简单版本:P6156 简单题。
8.3 狄利克雷前缀和
对于任意数论函数
对每个
首先容易想到一种暴力做法,直接枚举每一个数的倍数,这样就可以做到
但是并不是最优的,于是我们有了下面的算法。
将每个数
根据高位前缀和的求法,枚举每一维并将所有下标关于该维做前缀和,可以得到狄利克雷前缀和的实现方法:
初始令
最终得到的
于是你就可以通过 P5495 【模板】Dirichlet 前缀和 了。代码。
#include <bits/stdc++.h>
using namespace std;
#define uint unsigned int
const int N=2e7+5;
uint seed,ans,a[N];
int n,p[N>>3],cnt=0;
bool vis[N];
uint rd(){seed^=seed<<13,seed^=seed>>17,seed^=seed<<5;return seed;}
void init(){
for(int i=2;i<N;i++){
if(!vis[i]) p[++cnt]=i;
for(int j=1;j<=cnt&&i*p[j]<N;j++){
vis[i*p[j]]=true;
if(i%p[j]==0) break;
}
}
}
int main(){
cin>>n>>seed;init();
for(int i=1;i<=n;i++) a[i]=rd();
for(int i=1;i<=cnt;i++) for(int j=1;p[i]*j<=n;j++) a[p[i]*j]+=a[j];
for(int i=1;i<=n;i++) ans^=a[i];
cout<<ans;return 0;
}
9 整除分块
整除分块又称为数论分块,因其解决的问题与整除密切相关而得名。数论分块是用于求解形如
的合适,前提为
9.1 介绍
如果
,不同的 至多只有 个。
证明是简单的:
-
当
时, 只有 个。 -
当
时, ,也只有 个。
根据这条结论,我们枚举
只要我们能对
那么问题就转化成求使得
转化一下,发现
和
两边把
那么我们不重不漏地枚举所有整除值时,可以对于每一个
具体地,我们令当前枚举到的
将
这样每一次的整除值都可以被算一次,时间复杂度
-
当
的上界不为 时,要特殊处理:若 ,每次要把 和 取最小值;反之要特殊处理 的情况。 -
写的时候不要写成了
了!(有些人因为这个常常调很久)
9.2 拓展
拓展也是较为简单的。
我们尝试将 向下取整 转换成 向上取值。
对于左边界
设
最后一步是因为
注意到
另外一个拓展就是我们尝试进行 高维数论分块。
当和式中出现若干个下取整,形如
时,我们只需要每次令
即可。最后要对
时间复杂度
因为我们把存在
9.3 例题
几道简单题。
CF1603C Extreme Extension
对于一个数列,定义一次操作为选择数列中任何一个元素
,将这个位置替换成两个正整数 满足 定义一个数列的极端值为将这个数列变成 不降 数列的最小操作次数
给定一个长度为
的数列 ( ),让你求它的所有非空子段的极端值之和,对 取模 一个测试点中有多组数据,保证所有数据
的规模总和不超过
P2260 [清华集训2012] 模积和
求
mod 19940417 的值
。
P3579 [POI2014] PAN-Solar Panels
对于
组询问,每组询问给定四个整数 ,从区间 和 中任意选取两个整数 和 ,求 的最大值是多少。
, , 。
10 欧拉函数
欧拉函数是一类非常重要的数论函数。
10.1 定义与性质
欧拉函数的定义为在
显然,当
若
为质数,则 。
在
是 积性函数。即若 。
设与
因为
因此,对于每一个
根据算术基本定理,设
被唯一分解为 ,则 。
根据前面两个性质
得证。
当然,我们还可以用 容斥原理 来证明。
考虑去掉所有被至少一个
其中
这样我们也可以反推到积性函数上面。设
于是有
若
,则 。
根据前面
于是我们也容易得到这样的结论:
若
欧拉反演:
考虑
我们把法里级数中非零的部分提出来,例如当
约分得到
我们可以根据它们的分母将这些分数分组,就可以得到
对此,我们如何就是呢?
发现
也就是
这就是 欧拉反演。
同时它可以被表示成狄利克雷卷积的形式,也就是
。
假设
容易发现这种情况显然是满足条件的,即
使得
且 的 的个数为 。
使得这个条件成立的条件可以被表示成
如果我们把条件转移到
10.2 线性筛欧拉函数
根据上面欧拉函数的计算式,我们可以得到它的线性筛法,若
于是代码就是简单的
phi[1]=1;
for(int i=2;i<N;i++){
if(!vis[i]) p[++cnt]=i,phi[i]=i-1;
for(int j=1;j<=cnt&&i*p[j]<N;j++){
vis[i*p[j]]=true;
if(i%p[j]==0){
phi[i*p[j]]=phi[i]*p[j];
break;
}
else phi[i*p[j]]=phi[i]*(p[j]-1);
}
}
10.3 欧拉定理
欧拉发现费马的定理可以用下面的方式推广到非素数的模:
这和费马小定理是相当类似的,于是我们可以尝试用类似于费马小定理的方法来证明它。
将它们相乘并用
而当
10.4 扩展欧拉定理
再把欧拉定理进行一个扩展,可以得到
感性理解:
当
令这个
根据欧拉定理,
比较抽象,非常感性。
严谨证明 摘自 OI-wiki:
-
的从 次, 次到 次幂模 构成的序列中,存在 ,使得前 个数(即从 到 )互不相同,从 开始,每 个数就循环依次。在 3.5 中,我们对这个遗留问题进行了讨论。
-
为素数的情况,该是成立。证明:
-
若模
不能被 整除,那么有 成立,根据欧拉定理容易证明。 -
若模
能被 整除,那么存在 和 使得 ,且 成立。所以根据欧拉定理有 。
又由于
,所以根据欧拉函数的计算式,容易得到 ,即我们有 。所以
,即 ,两边同时乘 ,得 ,因为 。所以
中素因子 的次数 满足: 。我们可以简单变换形式,得到 推论:又由于
,所以 。所以因为
,故有:所以
即
。 -
-
为素数幂的情况,该式成立。证明:
不妨令
,是否依然有 ?答案是肯定的,由于第一点可知存在
使得 ,所以 ,所以令 时,我们能有 。此时有关系
且 ,且 ,由 与 的关系,依然可以得到 。 -
为合数的情况,该是成立。证明:
只证
拆成两个素数的幂的情况,大于两个的用数学归纳法可证。设
,其中 ,而 的循环长度为 ;则
,由于 ,那么 ,所以 ;由
与 的关系,依然可以得到 。
证毕。乐。
于是你就可以通过 P5091 【模板】扩展欧拉定理。代码。
10.5 例题
煎蛋题。
P2158 [SDOI2008] 仪仗队
本文作者:H_W_Y
本文链接:https://www.cnblogs.com/H-W-Y/p/18203759/NumberTheory3
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步