省选数论总结
@
前言
此篇仅供个人学习总结使用
常见符号及其意义
- \(a\mid b\)表示\(a\)是\(b\)的约数
- \(\lfloor \frac{a}{b} \rfloor\),表示\(a\)除以\(b\)下取整
- \(\prod \limits ^a_{i=1}p_i\)表示\(p_1,p_2,...p_n\)的乘积
- \(\sum \limits ^n_{i=1}a_i\)表示\(a_1,a_2,..a_n\)的和
- \(a \equiv b \pmod p\)表示\(a\)与\(b\)模\(p\)的结果是相同的
- \(\sum\limits_{d\mid n}\)表示枚举\(n\)的所有因子\(d\)
- \(f \times g(x)\)表示\(f\)函数与\(g\)函数的狄利克雷卷积
- \(\int_a^b f(x)dx\)表示定积分
- \(f(x)=[x=1]\)表示\(f(x)\)只有在\(x=1\)的时候才为\(1\),其他情况为\(0\)
数论函数
数论函数是定义域为正整数的函数,又叫做算数函数
积性函数
1. 定义
对于一个数论函数\(f(n)\),如果\(a\),\(b\)互质,\(f(ab)=f(a)f(b)\),那么\(f(n)\)为积性函数.特殊的,如果对于任意的\(a,b\)都有\(f(ab)=f(a)f(b)\),那么\(f(n)\)为完全积性函数
2.常见的积性函数
- 欧拉函数\(\phi(n)\)
- 莫比乌斯函数\(\mu(n)\)
- 幂函数(完全积性)\(f_k(n)=n^k\)
- 除数函数\(\sigma_xn=\sum\limits_{d\mid n}d^x\),即所有因子的\(x\)次幂之和.特殊的,当\(x=0\)的时候表示约数的个数,当\(x=1\)的时候表示约数之和
- 单位函数(完全积性)\(id(n)=n\)
- 元函数(完全积性)\(e(n)=[n=1]\)
- 恒等函数(完全积性)\(I(n)=1\)
3.利用线性筛预处理普通的积性函数
积性函数一般可以利用线性筛预处理,如莫比乌斯函数、欧拉函数等.
积性函数满足\(f(n)=\prod_{p_i}f(p_i^{k_i})\),线性筛的时候一般分为两种情况:
- 新增加了一种质因子,直接用定义即可
- 最小质因子的幂次增加1,根据具体题目具体分析
假设\(f\)函数为积性函数\(f(n)=\sum_{d\mid n}d\)\((f\)为因子之和函数\()\),线性筛的时候有两种情况
1.当\(i\)不是\(p\)的倍数,则\(f(i\times p)=f(i)\times f(p)\)
2.\(i\)是\(p\)的倍数,则考虑\(f(i\times p)\)比\(f(i)\)多了什么,实际上是某个\(f(p_i^{k_i})\)变成了 \(f(p_i^{k_i+1})\),在这里可以先除以\(f(p_i^{k_i})\),再乘\(f(p_i^{k_i+1})\).
欧拉函数
- \(\phi(1)=1\)
- \(\phi(p)=p-1\) \((p\)为素数\()\)
- \(\phi(p^k)=p^k-p^{k-1}=(p-1)\times p^{k-1}\) \((p\)为素数\()\)
- 若\(m,n\)互质,则有\(\phi(n*m)=\phi(n)*\phi(m)\)
- 对于任意 \(n=p_1^{k_1}*p_2^{k_2}*...*p_r^{k_r}\) (其中 \(p_1,p_2,...,p_k\) 为 \(n\) 的互不相同的质因子) 则有
\(\varphi(n)=\prod_{i=1}^{r}\varphi(p_i^{k_i})=\prod_{i=1}^{r}(p_i-1)p_i^{k_i-1}=\prod_{i=1}^{r}(1-\frac 1{p_i})*p_i^{k_i}=n*\prod_{i=1}^{r}(1-\frac 1{p_i})\) - 当\(n>1\)时,小于\(n\)的数中,与\(n\)互质的数的总和为\(\frac{\phi(n)*n}{2}\)
由此推导可得\(\sum\limits_{i=1}^ni\cdot[gcd(i,n)==1]=n\cdot \frac{\phi(n)+[n==1]}{2}\) - \(\sum\limits_{d\mid n}\phi(d)=n\)
- 若\(n,a\)为正整数且\(n,a\)互质,则
\(a^{\phi(n)}\equiv 1\pmod n\),
\(a^{\phi(n)-1}\equiv a^{-1}\pmod n\)
当\(n>1,a,n\)互质,\(a^b\mod n=a^{b\mod \phi(n)}\mod n\)
莫比乌斯函数
1.定义
莫比乌斯函数\(\mu(m)\)
定义\(\mu(1)=1\)
当\(x=p_1p_2..p_n\),且\(p_i\)为不同的质数(即\(x\)由若干幂次为\(1\)的质数相乘),\(\mu(x)=(-1)^n\),其他情况\(\mu(x)=0\)
2.性质
1.\(\sum_{d\mid n}\mu(d)=[n==1]\)
2.莫比乌斯函数为积性函数
3.莫比乌斯函数的代码实现
利用积性性质线性筛\(O(n)\)处理
const int N=1e5+10;
int mu[N],p[N],pn=0;//mu,质数,质数个数
bool flag[N];//标记质数
void getmu(){
mu[1]=1;pn=0;
for(int i=2;i<N;i++){
if(!flag[i]) mu[i]=-1;
for(int j=1;j<=pn&&(ll)i*(ll)p[j]<N;j++){
flag[i*p[j]]=1;
if(!(i%p[j])){mu[i*p[j]]=0;break;}
else mu[i*p[j]]=-mu[i];
}
}
}
4.莫比乌斯函数与欧拉函数
应用卷积得:
\[\phi(n)=\sum\limits_{d\mid n}\mu(d)f(\frac{n}{d})=\sum\limits_{d\mid n}\mu(d)\frac{n}{d} \]
莫比乌斯反演
1.公式
若$$f(n)=\sum\limits_{d\mid n}g(d)=\sum\limits_{d\mid n}g(\frac{n}{d})$$
则$$g(n)=\sum\limits_{d\mid n}f(d)\mu(\frac{n}{d})=\sum\limits_{d\mid n}f(\frac{n}{d})\mu(d)$$
以上二式互为充分必要条件
另一种形式:
\[f(n)=\sum\limits_{n\mid d}g(d) \]\[g(n)=\sum\limits_{n\mid d}f(d)\mu(\frac{d}{n}) \]
狄利克雷卷积
1.定义
定义两个数论函数的狄利克雷卷积为:
\[(f\times g)(n)=\sum\limits_{d\mid n}f(d)\times g(\frac{n}{d}) \]也可以写成
\[(f\times g)(n)=\sum\limits_{ab=n}f(a)\times g(b) \]
2.狄利克雷卷积的性质及其常见应用
- 交换律:\(f\times g=(g\times f)\)
- 结合律:\((f\times g)\times h=f\times (g\times h)\)
- 分配率:\((f+g)\times h=f\times h+g\times h\)
- 如果\(f(n),g(n)\)都为积性函数,那么他们的狄利克雷卷积也为积性函数
- 任何数论函数都与元函数的卷积等于函数自己,即\((f\times e)(n)=\sum\limits_{d\mid n}f(d)\times e(\frac{n}{d})=f(n)\)
- \((\mu \times I)(n)=\sum\limits_{d\mid n}\mu(d)\times I(\frac{n}{d})=\sum\limits_{d\mid n}\mu(d)=e(n)\)
- \(\phi\times I(n)=\sum\limits_{d\mid n}\phi(d)\times I(\frac{n}{d})=\sum\limits_{d\mid n}\phi(d)=n=id(n)\)
- \(\phi =id\times \mu\)\((\)第七条左右式同乘\(\mu\)\()\)
3.狄利克雷卷积的代码实现
复杂度:\(O(nlogn)\)
for (int i = 1; i <= n; i++) {
for (int j = 1; i*j <= n; j++) {
res[i * j] += f[i] * g[j];
}
}
4.狄雷克雷卷积与其他函数的结合应用
推导莫比乌斯反演
已知一个数论函数\(f(n)=\sum\limits_{d\mid n}g(d)\),那么\(f=g\times I\) \((\) \(g\)函数与恒等函数\(I\)函数的卷积 \()\),根据狄利克雷卷积的性质,在两边同乘\(\mu\),得到:
\[f\times \mu=g\times I\times \mu=g\times e=g \]所以
\[g(n)=\sum\limits_{d\mid n}f(d)\mu(\frac{n}{d}) \]可见狄利克雷卷积对原问题进行了更高层次的抽象,使问题变得简单
推导\(\mu\)和\(\phi\)的关系
已知欧拉函数一性质:
\[n=\sum\limits_{d\mid n}\phi(d) \]令\(f(n)=n,g(n)=\phi(n)\),反演得:
\[\phi(n)=\sum\limits_{d\mid n}\mu(d)f(\frac{n}{d})=\sum\limits_{d\mid n}\mu(d)\frac{n}{d} \]
整除分块
1.概念思想
考虑最简单的情况,对于\(\sum\limits_{i=1}^n{\lfloor\frac{n}{i}\rfloor}\)
通过一些性质的分析可发现,\(\lfloor\frac{n}{i}\rfloor\)是由若干段值相等的区间构成的,假设该区间左边界为\(L\),右边界为\(R\),那么对于区间内的每个值,往往可以用基本相同的式子得到答案,乘上与区间长度有关的系数即可,这样一段取值序列\([1,n]\)被分成\(\sqrt n\)块,复杂度\(O(\sqrt n)\)
在最简单的整除分块中,对于已知的\(L\),对应的\(R=\lfloor\frac{N}{\lfloor\frac{N}{L}\rfloor}\rfloor\)
2.定理
- \(\sum\limits_{i=1}^n\lfloor\frac{n}{i}\rfloor=2\sum\limits_{i=1}^{\lfloor\sqrt{n}\rfloor}\lfloor\frac{n}{i}\rfloor-(\lfloor\sqrt{n}\rfloor)^2\)
- \(\sum\limits_{i=1}^n{\lfloor\frac{n}{i}\rfloor}=\sum\limits_{d=1}^n{\sigma_0(d)}\) \((\) \(\sigma_0(d)\) 表示 \(d\) 的因子个数 \()\)
- \(\sum\limits_{i=1}^n{\lfloor\frac{n}{i}\rfloor}=\sum\limits_{i=1}^n\sum\limits_{j=1}^n[i\cdot j\leq n]\)
3.代码实现
假设求\(\sum\limits_{i=1}^n{\lfloor\frac{n}{i}\rfloor}\),这里给出最基本的写法
ll get(ll n){
ll ans=0;
for(ll L=1,R;L<=n;L=R+1){
R=n/(n/L);
ans=(ans+(ll)(R-L+1)*(ll)(n/L)%M)%M;
}
return ans;
}
4.常见卷积
- \((\mu\times I)(n)=\sum\limits_{d\mid n}\mu(d)=e(n)=[n==1]\)
- \((\phi\times I)(n)=\sum\limits_{d\mid n}\phi(d)=n=id(n)\)
- \(\phi=id\times \mu\)
- \((f\times e)(n)=f(n)\)
积性函数前缀和
1.概念思想
对于积性函数f(n),求
\[S(n)=\sum\limits_{i=1}^nf(i)(1\leq n\leq 10^10) \]以上问题可用杜教筛解决
为解决此问题,先尝试计算\(g\times f\)的前缀和:
\(\sum\limits_{i=1}^n(f\times g)(i)=\sum\limits_{i=1}^n\sum\limits_{d\mid i}g(d)f(\frac{i}{d})=\sum\limits_{d=1}^ng(d)\sum\limits_{d\mid i}f(\frac{i}{d})=\sum\limits_{d=1}^ng(d)\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}f(i)=\sum\limits_{i=1}^ng(i)S(\lfloor\frac{n}{i}\rfloor)\)
得到:
\(S(n)\)是要求的值,\(S(\lfloor\frac{n}{i}\rfloor)\)可以递归解决,关键要找到合适的\(g\)
用线性筛等预处理出\(S(i)\)前\(n^{\frac{2}{3}}\)项,剩余的项采用记忆化搜索(用hash或者map记录值)
假设查询q次前缀和,总复杂度为\(O(q+n^{\frac{2}{3}})\),花在查询上的复杂度始终是均摊\(O(n^{\frac{2}{3}})\)
2.代码实现
这里以求\(\mu\)的前缀和为例
假设题目\(n\leq 1e9\)
取\(I\)与\(\mu\)卷积,得
即
const int N=1e6+5;//1e9的2/3次幂为1e6
const ll M=1e9+7;//题目的模数
#define un_mp unordered_map
un_mp<ll,ll> q;//unordered_map实现记忆化搜索
int mu[N],p[N],pn=0;bool flag[N];
void pre(){
mu[1]=1;
for(int i=2;i<N;i++){
if(!flag[i]) p[++pn]=i,mu[i]=(-1+M)%M;;
for(int j=1;j<=pn&&(ll)i*(ll)p[j]<N;j++){
flag[i*p[j]]=1;
if(!(i%p[j])){mu[i*p[j]]=0;break;}
else mu[i*p[j]]=(M-mu[i])%M;
}
}
for(int i=2;i<N;i++) mu[i]=(mu[i]+mu[i-1])%M;//预处理前若干项前缀和
}
ll solve(ll n){//剩余的前缀和递归计算
if(n<N) return mu[n];//若已预处理,直接return值
if(q[n]) return q[n];//若已记忆化,直接return值
ll res=1ll;
for(ll L=2,R;L<=n;L=R+1){//整除分块加速计算
R=(n/(n/L));
res=(res+M-(ll)(R-L+1)%M*solve(n/L)%M)%M;
}
return q[n]=res;//记忆化
}
3.常见的前缀和与g的选取
- 对于\(\sum\limits_{i=1}^n\mu(i)\),选取\(I\):\(S(n)=1-\sum\limits_{i=2}^nS(\lfloor\frac{n}{i}\rfloor)\)
- 对于\(\sum\limits_{i=1}^n\phi(i)\),选取\(I\):\(S(n)=n*(n+1)/2-\sum\limits_{i=2}^nS(\lfloor\frac{n}{i}\rfloor)\)
- \(\phi=id\times \mu\):变成求\(\phi\)的前缀和
常用技巧
1.推导方法
- 交换枚举的先后顺序
- 交换约数与倍数
- 对于\(d\mid n\),往往可以转而枚举\(d\)和\(n\)对\(d\)的倍数\(\lfloor\frac{n}{d}\rfloor\),此时要注意原有数值所代表的的意义及其表示在操作后的变化,分清系数的关系
- 替换和式中的标号
- 用\(\mu\)替换形似\([g==1]\)的式子
- 对于\([g==d]\)的式子,可以将\(d\)提出,然后有选择地进行步骤5
- 若式子里有\(gcd(i,j)\)的形式,可以枚举\(gcd(i,j)\)的值,即枚举\(d\)后转化为\([gcd(i,j)==d]\)的形式,根据题目有选择地进行步骤6
- 常见的卷积形式见上文
2.计算优化
- 对于\(\sum\limits_{i=1}^n\lfloor\frac{n}{i}\rfloor\),可以整除分块加速计算
3.其他定理
- \(\sum\limits_{i=1}^ni=\frac{n(n+1)}{2}\)
- \(\sum\limits_{i=1}^ni^2=\frac{n(n+1)(2n+1)}{6}\)
- \(\sum\limits_{i=1}^ni^3=[\frac{n(n+1)}{2}]^2\)
- \(1+3+5+...+(2n-1)=n^2\)
TIPS
- 整除分块时注意int和long long在效率上的差别
- \(\mu\)可能为负,在取模题中注意对其取模
- 注意不要爆int,不要爆int,不要爆int
- 对于某些毒瘤题目,酌情使用unsigned long long
- 注意\(\sum\limits_{i=1}^n\)与\(\sum\limits_{i=1}^ni\)的区别

浙公网安备 33010602011771号