数论基础
基础概念及运用
整除
若对于正整数 \(n,m\),如果存在整数 \(q\) 使得 \(n=mq\),则称 \(m\) 整除 \(n\),记做 \(m|n\)。
最大公约数
\(\gcd(x,y)\)。
互质
最大公约数为 \(1\)。
整除函数与整除分块
记 \(\left\lfloor x\right\rfloor\) 表示不大于 \(x\) 的最大整数。
对于正整数 \(n\),\(1\) 到 \(n\) 中 \(d\) 的倍数有 \(\left\lfloor\frac{n}{d}\right\rfloor\) 个,我们经常考虑形如 \(\left\lfloor\frac{n}{d}\right\rfloor\) 的数,可以证明有不超过 \(\sqrt{n}\) 个这样的取值。有如下性质:
给定正整数 \(n\),求:
\[\sum_{d=1}^{n}\left\lfloor\dfrac{n}{d}\right\rfloor \]其中 \(n\le 10^{14}\)。
对于 \(\left\lfloor\dfrac{n}{d}\right\rfloor\) 的每个取值,对应 \(d\) 的范围是一个区间,直接枚举取值即可。
scanf("%lld",&n);
for(ll l=1,r,tmp;l<=n;l=r+1)
{
tmp=n/l,r=n/tmp;
ans+=(r-l+1)*tmp;
}
printf("%lld\n",ans);
还有一个比较显然的结论:
其中有一个式子需要注意一下:
对它们分别整除分块就好了。
最重要的一部分就是计算 \(1\) 到 \(n\) 内每个数的约数个数之和,这样不是很好做,考虑枚举约束。
这样直接数论分块就做完了。
调和数
调和数定义为 \(H_n=\sum_{k=1}^{n}\frac{n}{k}\),大小大约在 \(n\log n\) 级别。
这可以推出一个常见复杂度:
素数
如果一个数 \(p\) 的约数只有 \(1\) 和 \(p\) 自身,称 \(p\) 是素数。
任意一个正整数 \(n\) 都可以表示为素数的乘积形式:
不计次序情况下,该分解是唯一的。
如何筛素数?欧拉筛!
每次遍历一个数,对于所有已知的且不是它的因子的质数,将他们的乘积标记为合数。
for(int i=2;i<=MAX;i++)
{
if(!vis[i]) p[++cnt]=i;
for(int j=1;j<=cnt && i*p[j]<=MAX;j++)
{
vis[i*p[j]]=true;
if(i%p[j]==0) break;
}
}
素数计数函数 \(\pi(n)\) 表示不超过 \(n\) 的素数个数。
素数定理:\(\pi(n)\) 大约在 \(\dfrac{n}{\ln(n)}\) 级别。
推论:
- \(n\) 附近的素数密度近似为 \(\dfrac{1}{\ln(n)}\),即找 \(\ln(n)\) 个数基本上就能够找到一个素数。
- 第 \(n\) 个素数 \(p_n\) 大约等于 \(n\ln(n)\)。
数论函数
放在前面 - 常见转化套路
套路 \(1\):要求出所有 \([1,n]\) 内与 \(n\) 互质的数的和。
这时我们发现如果 \(\gcd(i,n)=1\),一定有 \(\gcd(n-i,n)=1\),互质的数都是成对出现的(除了 \(1\) 和 \(2\))。
和就是 \(n\dfrac{\varphi(n)}{2}\)。
套路 \(2\):
快速表达 \([\gcd(x,y)=1]\):根据 \(\epsilon=\mu*1\),可以得到:
快速表达 \(\gcd(x,y)\):
套路 \(3\):求 \(d(ij)\),即 \(i\times j\) 的约数个数。
套路 \(4\):
求 \(n\) 以内的无平方因子的数的个数,即求:
我们考虑容斥,对于一个素数 \(p\),\(p^2\) 的倍数都有平方因子,个数时 \(\left\lfloor\dfrac{n}{p^2}\right\rfloor\),从答案中减去。
那么减掉多次需要加回来,发现答案就是:
其实莫比乌斯函数可以看做一个容斥。
积性函数
设 \(f\) 是数论函数,若对于任意互质的正整数 \(a,b\),都有 \(f(ab)=f(a)f(b)\),则称 \(f\) 是积性函数。
若 \(f\) 是积性函数,且 \(n=p_1^{\alpha_1}p_2^{\alpha_2}\cdots p_k^{\alpha_k}\) 的标准分解,则有
因此研究积性函数 \(f\) 是可以转化为研究 \(f(p^{\alpha})\)。
积性函数求值可以对 \(n\) 分解质因子之后乘起来,正好可以用欧拉筛求。
单位函数【积性函数】
除数函数【积性函数】
用来表示 \(n\) 的因子的 \(k\) 次方和。
其中约数个数 \(\sigma_0(n)=d(n)\),约束和 \(\sigma_1(n)\) 常记做 \(\sigma(n)\)。
欧拉函数【积性函数】
表示不超过 \(n\) 且与 \(n\) 互质的正整数数量,可以由 \(n\) 的标准分解和容斥原理推出。
性质:对于任意 \(n\),欧拉函数有如下性质:(可以用 \(1\) 到 \(n\) 中所有数按照与 \(n\) 最大公约数分类来证明)
线性求解方法:
void prephi()
{
phi[1]=1;
for(int i=2;i<=MAX;i++)
{
if(!phi[i]) phi[i]=i-1,p[++cnt]=i;
for(int j=1;j<=cnt && i*p[j]<=MAX;j++)
{
if(i%p[j]) phi[i*p[j]]=phi[i]*(p[j]-1);
else { phi[i*p[j]]=phi[i]*p[j]; break; }
}
}
}
单点求解:标准分解,正难则反
inline int varphi(ll x)
{
ll ret=x;
for(ll i=2;i*i<=x;i++)
{
if(x%i==0) ret=ret/i*(i-1);
while(x%i==0) x/=i;
}
if(x>1) ret=ret/x*(x-1);
return ret;
}
身份函数
狄利克雷卷积
称 \(f,g\) 是数论函数,则考虑数论函数 \(h\) 满足
则称 \(h\) 是 \(f\) 和 \(d\) 的狄利克雷卷积,记做 \(h=f*g\)。
满足交换律、结合律。
性质:
-
若 \(f,g\) 都是积性函数,则 \(f*g\) 也是积性函数。
-
除数函数定义可以写为:
\[\sigma_k=1*Id_k \]欧拉函数的性质可以写为:
\[Id=n*1 \]
如果需要计算 \(f*g\) 的前 \(n\) 项,可以用调和数快速计算。
给定正整数 \(n\),求
\[\sum_{i=1}^{n}\gcd(i,n) \]\(n\le 2^{32}\)。
则直接枚举 \(n\) 的约数求即可。
莫比乌斯函数【积性函数】
莫比乌斯函数 \(\mu(n)\) 定义为:(如果存在平方因子直接为 \(0\))
线性求解:
void premu()
{
mu[1]=1;
for(int i=2;i<=MAX;i++)
{
if(!vis[i]) mu[i]=-1,p[++cnt]=i;
for(int j=1;j<=cnt && i*p[j]<=MAX;j++)
{
if(i%p[j]) mu[i*p[j]]=-mu[i],vis[i*p[j]]=true;
else { mu[i*p[j]]=0,vis[i*p[j]]=true; break; }
}
}
}
单点求值:
inline int mu(int x)
{
int ret=1;
for(int i=2;i*i<=x;i++) if(x%i==0)
{
ret=-ret,x/=i;
if(x%i==0) return 0;
}
return ret;
}
最重要的性质:
如果使用狄利克雷卷积表示,即
莫比乌斯变换
设 \(f\) 是数论函数,定义函数 \(g\) 满足
称 \(g\) 是 \(f\) 的莫比乌斯变换,\(f\) 是 \(g\) 的莫比乌斯逆变换。
用狄利克雷卷积表示就是 \(g=f*1\)。
莫比乌斯反演定理
定理指出,莫比乌斯变换的充要条件为:
证明可以用狄利克雷卷积:
应用:利用狄利克雷卷积可以解决一系列求和问题。通常用一个狄利克雷卷积替换求和式中的一部分,再调换求和顺序,最终减小复杂度。
常见的卷积有:\(\mu*1=\epsilon\) 和 \(\varphi*1=Id\)。
莫比乌斯反演实际运用
就是把一个看起来只能暴力算的柿子化成一个可以一下子算出来或者数论分块可以算出来的东西。
以下都默认 \(n\le m\)。
形式1
数论分块即可 \(O(n)\) 预处理, \(O(\sqrt n)\) 单次询问。
形式2
数论分块即可 \(O(n)\) 预处理, \(O(\sqrt n)\) 单次询问。
形式3
数论分块即可 \(O(n)\) 预处理, \(O(\sqrt n)\)单次询问。
莫比乌斯反演形式千千万,要多做才能做出感觉来。
数论函数求和
发现如果直接处理数论函数的每一项太慢了,所以发明了一种新的筛法,叫做杜教筛。
如果我们需要计算 \(f\) 函数的前缀和 \(F\),那么尝试找到一个函数 \(g\):(下面称 \(g\) 的前缀和叫做 \(G\),\(f*g\) 的前缀和叫做 \(S\))
我们发现:
上面这个便是杜教筛的核心式子,如果可以找到一个合适的 \(g\) 使得 \(G(n)\) 与 \(S(n)\) 能够在优于杜教筛 \(\mathcal{O(n^{\frac{3}{4}})}\) 的复杂度内计算完成就可以快速计算出 \(F\) 的前缀和。
常用的卷积转化有:\(\mu*1=\epsilon\) 和 \(\varphi*1=Id\)。
基本上如果需要预处理 \(G\) 和 \(S\) 时,一般处理到 \(5\times 10^6\) 即可,\(F\) 的求值范围可以到 \(10^{11}\) 左右。
欧拉函数求和与莫比乌斯函数求和利用上面的两个卷积关系即可,除数函数直接转换后好像整除分块就搞定了。
P1587 [NOI2016] 循环之美
首先发现如果一个分数 \(\frac{x}{y}\),\([x\perp y][y\perp k]\) 时这个分数才是纯循环的。
如果我们能够快速求出 \([d|k]\mu(d)\) 与 \(\sum_{y=1}^{m}[y\perp k]\),就可以整除分块 \(\sqrt{n}\) 求出答案。令:
初始值 \(f(*,1)\) 可以直接算出,\(g(*,1)\) 用杜教筛算出。
考虑 \(k\) 的某一个素因子 \(p\) 对 \(f(n,k),g(n,k)\) 的影响:
记忆化搜索即可,记得每次计算之前先把 \(k\) 重复的质因子删去!!!
杂项
阶
对于 \(a\perp n\) 的 \(a\),定义 \(a\) 模 \(n\) 的阶为最小的正整数 \(d_n(a)\) 满足:
根据欧拉定理得 \(d_n(a)|\varphi(n)\)。
原根
如果上面的阶 \(d_n(a)=\varphi(n)\),则称 \(a\) 为 \(n\) 的原根。
\(a\) 是模 \(n\) 的原根仅当 \(a^0,a^1,\dots,a^{\varphi(n)-1}\) 在 \(\bmod n\) 意义下两两不同,这也是原根重要的性质和等价定义。
\(n\) 存在原根当且仅当 \(n=1,2,4,p^k,2p^k\),其中 \(p\) 为质数。
离散对数
设 \(d\) 为模 \(n\) 的原根,则对于任意 \(a\) 满足 \(a\perp n\),均存在 \(k\) 使得:
这样有助于将 \(\bmod n\) 的乘法转化为 \(d\) 的幂次上 \(\bmod \varphi(n)\) 的加法。