质数与约数
1.调和级数
- Proof(粗略计算):
-
更精确的公式:
\[\sum_{i=1}^n \frac{1}{i}=\ln n+ \gamma+ \varepsilon (n) \] -
其中:
\[\gamma \approx0.57721 56649 01532 \]\[\varepsilon (n) \approx \dfrac{1}{2n} \]
2.质数个数
\(N\) 以内的质数个数:
也就是说,每 \(\ln N\) 个数中就可能出现一个质数。
则暴力寻找第一个比 \(x\) 大(小)的质数的时间复杂度为 \(O(\sqrt{x} \ln x)\),当 \(x\leq10^{14}\) 时可以在 \(1s\) 内跑过。
3.线性筛
在线性筛中,我们可以实现每一个合数都只被它的最小质因子筛去一次。
记 \(x\) 的最小质因子为 \(mnp(x)\)。
考虑枚举 \(i\) 和质数 \(j\),如果 \(mnp(ij)=j\),那么我们就将 \(ij\) 标记为合数。
结论:\(mnp(ij)=j\) 的充要条件是 \(j\leq mnp(i)\)。
必要性:若 \(j>mnp(i)\),则 \(ij\) 可以表示为 \(mnp(i) \times \dfrac{i}{mnp(i)} \times j\),与 \(mnp(ij)=j\) 矛盾。
充分性:\(mnp(ij)=\min(mnp(i),j)=j\)。
根据结论进行实现即可。
void Solve(){
for(int i=2;i<=n;i++){
if(!vis[i]) prime.push_back(i);
for(int j:prime){
if(i>n/j) break;
vis[i*j]=1;
if(!i%j) break;
}
}
}
4.算术基本定理
其中:\(p_i\) 为质数,\(c_i\) 为常数,\(p_1<p_2<p_3<\dots<p_m\)。
由此可得,\(N\) 至多只有一个大于 \(\sqrt{N}\) 的质因子。
\(N\) 的约数个数:
\(N\) 的约数和:
从组合角度可以证明。
求 \(1 \sim N\) 的正约数集合:考虑用倍数法,枚举 \(i\) 作为约数,则 \(i,2i,3i,4i\dots\lfloor\dfrac{N}{i}\rfloor i\) 的正约数集合中都含有 \(i\)。
int n;
vector<int> S[N];
void Solve(){
for(int i=1;i<=n;i++)
for(int j=1;i*j<=n;j++)
S[i*j].push_back(i);
for(int i=1;i<=n;i++){
for(int j:S[i])
printf("%d ",j);
puts("");
}
}
该算法的时间复杂度为 \(O(\sum_{i=1}^N \dfrac{N}{i})=O(N \log N)\)。
由此得到推论:\(1\sim N\) 的正约数集合大小之和不会超过 \(N \log N\)。
Ex.1 [P1463]反素数
-
引理 1:\([1,N]\) 中最大的反素数,就是 \([1,N]\) 中约数个数最多的数中的最小的一个。
-
引理 2:对于 \(\forall i \in [1,N]\),不同的质因子个数不会超过 \(10\),所有质因子的指数之和不会超过 \(30\)。
-
引理 3:设所有在 \([1,N]\) 中的反素数集合为 \(S\) 则对于 \(\forall k \in S\),有:
\[k=\prod_{i=1}^mp_i^{c_i},c_1\geq c_2\geq c_3\geq \dots\geq c_m \]Proof:由引理 1 与 \(i \in [1,N]\) 得,把指数尽量加在较小质数上约数个数更大。
暴搜+剪枝即可。
5.\(\gcd\) 与 \(\operatorname{lcm}\)
-
二者转化关系:
\[\operatorname{lcm}(a,b)=\dfrac{a\times b}{\gcd(a,b)} \] -
Proof:\(a=\gcd(a,b)\times k_1,b=\gcd(a,b)\times k_2\),可得 \(k_1 \perp k_2\)。
\(\operatorname{lcm}(a,b)=k_1\times k_2 \times gcd(a,b)=\dfrac{a\times b}{\gcd(a,b)}\)
-
更相减损术 \((a \geq b)\):
\[\gcd(a,b)=\gcd(a,a-b)=\gcd(b,a-b) \] -
Proof:以 \(\gcd(a,b)=\gcd(a,a-b)\) 为例。设 \(a,b\) 的公约数集合为 \(S_1\),\(a,a-b\) 的公约数集合为 \(S_2\)。对于 \(\forall k \in S_1\),\(a=k\times x_1,b=k\times x_2,a-b=k\times (x_1-x_2)\),则 \(S_1 \subseteq S_2\)。同理可得 \(S_2 \subseteq S_1 \Rightarrow S_1=S_2\),命题得证。
-
辗转相除法:
\[\gcd(a,b)=\gcd(b,a\bmod b)=\gcd(a,a\bmod b) \] -
Proof:与更相减损术同理,令 \(a=pb+r \ (0 \le r <b)\),则 \(a \bmod b=r=a-pb\)。对于 \(\forall k \in S_1\),\(a=k\times x_1,b=k\times x_2,r=k\times (x_1-k_2\times p)\)。由此可得 \(S_1=S_2\)。
Ex.2 GCD 与 LCM
解法 1:
设 \(A=x_1\times GCD,B=x_2\times GCD\)。则 \(LCM=\dfrac{A\times B}{GCD}=x_1\times x_2\times GCD\)。考虑枚举 \(x_1\),则\(A=x_1\times GCD,B=\dfrac{LCM}{x_1}\)。当 \(x_1\) 合法时,有 \(x_1 \mid \dfrac{A}{GCD},\gcd(x_1,\dfrac{LCM}{GCD\times x_1})=1\)。
考虑 \(x_1\) 的枚举范围:
倒序枚举 \(x_1\),由于 \(x_1\) 越大,\(B-A\) 越小,则当找到第一个满足以上所有条件的 \(x_1\) 时停止枚举,此时答案为 \(\dfrac{LCM}{x_1}-x_1 \times GCD\)。
解法 2:
由于 \(x_1\times x_2=\dfrac{LCM}{GCD}\),则考虑将 \(\dfrac{LCM}{GCD}\) 分解质因数。设\(\dfrac{LCM}{GCD}=D\),由 \(\gcd(x_1,x_2)=1\) 得,\(x_1,x_2\) 不会有相同的质因子。则可以二进制枚举 \(D\) 的每一个质因子分给 \(x_1\) 还是 \(x_2\),答案取 min 即可。
Ex.3 Neko Does Maths
答案可表示为:
考虑枚举 \(a-b\) 的因子 \(w\) 作为分母,显然 \(k\) 越小答案越优。分两种情况讨论:
- 当 \(w \mid b\) 时,\(k\) 可以取 \(0\)。
- 否则,需要找到一个 \(k\),满足 \(w\mid (b+k)\)。易得 \(k=w- (b \bmod w)\)。
- 所有得到的 \(\operatorname{lcm}(a+k,b+k)\) 中的最小值即为答案。
6.整除分块/数论分块
整除分块/数论分块
整除分块通常用来快速求出形如这样的式子:
我们如果能够 \(O(1)\) 求出一段 \(f(i)\) 的和与某一个 \(g(i)\) 的值,那么利用整除分块,上式的值就能在 \(O(\sqrt{n})\) 的复杂度内求出。
设 \(h(i)=\lfloor \dfrac{n}{i} \rfloor\),将所有 \(h(i)\) 相等的 \(i\) 分为一块。那么 \(h(i)\) 不同的取值不会超过 \(2\sqrt{n}\)。
当 \(i\leq \sqrt{n}\) 时,最多有 \(\sqrt{n}\) 种 \(\lfloor \dfrac{n}{i} \rfloor\);当 \(i>\sqrt{n}\) 时,\(\dfrac{n}{i}<\sqrt{n}\),不同的 \(\lfloor \dfrac{n}{i} \rfloor\) 也不会超过 \(\sqrt{n}\) 个。
下面是一个更为严谨的证明。
设 \(x_1,x_2 \in [1,\sqrt{n}],x_2=x_1+1\)。设 \(y_1=\lfloor \dfrac{n}{x_1} \rfloor,y_2=\lfloor \dfrac{n}{x_2} \rfloor\),有 \(y1>y2\)。
假设 \(y1=y2=k\geq\sqrt{n}\)。则有 \((0\leq c_1<x_1,0\leq c_2 <x_1+1)\):
\[\begin{aligned}x_1k+c_1&=(x_1+1)k+c_2\\x_1k+c_1&=x_1k+k+c_2\\c_1&=k+c_2\\k\geq \sqrt{n}&\Rightarrow c_1\geq\sqrt{n}\geq x_1\end{aligned} \]与 \(c_1<x_1\) 矛盾,假设不成立。则 \(y_1>y_2\) 得证。
对于 \(\forall i \in [y_2+1,y_1]\),\(f(i)=x_1\)。
取上界 \(y_1\) 时,\(\lfloor \dfrac{n}{y_1} \rfloor=x_1\)。
取下界 \(y_2+1\) 时:
\[\begin{aligned}x_2\times y_2 +r &= n \ (0 \leq r < x_2) \\x_2 \times (y_2+1) & < n \\x_2 &< \lfloor \dfrac{n}{y_2+1} \rfloor \leq x_1\end{aligned} \]则有 \(\lfloor \dfrac{n}{y2+1} \rfloor=x_1\)。
对于 \(\forall i \in [1,\sqrt{n}]\),\(f(i)\) 两两不同;
对于 \(\forall i \in [\sqrt{n},n]\),有连续一段的 \(f(i)\) 相同,且与 \([1,\sqrt{n}]\) 中的数字一一对应。
命题得证。
接下来考虑怎么将这些块划分出来。
注意到一个块的左端点 \(L\) 一定是上一个块的右端点加一,所以我们只需要求出这个块的右端点 \(R\)。
根据定义得,\(R\) 即为最大的使得 \(\lfloor \dfrac{n}{i} \rfloor =k\) 最大的 \(i\)。
可得 \(R=\bigg \lfloor \dfrac{n}{\lfloor \dfrac{n}{L} \rfloor} \bigg \rfloor\)。
下面是求 \(\sum_{i=1}^n \lfloor \dfrac{n}{i}\rfloor\) 的一份参考代码。
ll DivBlock(){
ll res=0,j=0;
for(int i=1;i<=n;i=j+1){
j=n/(n/i);
res+=1ll*(j-i+1)*(n/i);
}
return res;
}
当上界 \(n\) 与被除数 \(k\) 不相等时,为避免越界,我们需要加一下特判:
ll DivBlock(){
ll res=0,j=0;
for(int i=1;i<=n;i=j+1){
if(k/i==0) break;
else j=min(k/(k/i),n);
res+=1ll*(k/i)*(j-i+1);
}
return res;
}
若下取整改为上取整,也可以用类似的方法做。
此时,我们要求的 \(R\) 即为使得 \(\lceil \dfrac n i \rceil=\lceil \dfrac n L \rceil\) 的最大的 \(i\)。
由此可得 $R=\bigg\lfloor \dfrac{n-1}{\lceil \dfrac n L \rceil-1}\bigg \rfloor $。
重要结论
Conclusion 1:若 \(i\) 为一个块的右端点,则 \(\lfloor \frac n i \rfloor\) 也为某个块的右端点。
反证法。设存在一个 \(i\) 为一个块的右端点,且 \(\lfloor \frac n i \rfloor\) 不为某个块的右端点。
下面记 \(x=\lfloor \frac n i \rfloor\)。命题等价于存在一个右端点 \(i\),使得 \(\lfloor \frac{n}{x} \rfloor=\lfloor \frac{n}{x+1} \rfloor\)。
由右端点计算公式,等式左边为 \(i\),即 \(\lfloor \frac{n}{x+1} \rfloor=i\),即 \(n=i(x+1)+p=xi+i+p\)。
设 \(n=xi+r\),那么有 \(0\leq r<i\)。则 \(xi+i+p>xi+r=n\),矛盾。
Conclusion 2:设共有 \(m\) 个块,\(R_i\) 为一个块的右端点,则 \(\lfloor\dfrac n {R_i} \rfloor=R_{m-i+1}\)。
结合 结论 1 与 上面的对整除分块的证明 易得。
Conclusion 3:设所有 \(\lfloor \frac n i \rfloor \ (1\leq i\leq n)\) 的集合为 \(S\),所有右端点的集合为 \(T\),有 \(S=T\)。
由结论 1,所有的 \(\lfloor \frac n i \rfloor\) 都能表示为一个右端点,则 \(S\subseteq T\)。
由右端点计算公式,\(R= \lfloor \frac{n}{\lfloor \frac{n}{L} \rfloor} \rfloor\),所有的右端点都能表示为一个 \(\lfloor \frac n i \rfloor\),则 \(T\subseteq S\)。
得出 \(S=T\)。
Conclusion 4:\(i\) 为右端点的充要条件是 \(\lfloor\frac{n}{\lfloor \frac n i \rfloor} \rfloor=i\)。
必要性:由右端点计算公式易得。
充分性:设存在一个 \(i\),\(\lfloor\frac{n}{\lfloor \frac n i \rfloor} \rfloor=i\) 且 \(\lfloor \frac n i \rfloor =\lfloor \frac n {i+1}\rfloor\)。设 \(\lfloor \frac n i \rfloor =\lfloor \frac n {i+1}\rfloor=k\)。
由 \(\lfloor\frac{n}{k} \rfloor=i\),得 $n=ki+r \ (0\leq r<k) $。
由 \(\lfloor \frac n {i+1} \rfloor =k\),得 \(n=k(i+1)+p=ki+k+p \ (0\leq p<i+1)\)。
\(ki+k+p>ki+r\),矛盾。故充分性成立。
7.欧拉函数
定义与求法
定义:设 \(\varphi(n)\) 为 \(n\) 的欧拉函数值,则:
也就是 \(1\sim n\) 之间与 \(n\) 互质的数字个数。
考虑如何快速求出这个式子。
根据算数基本定理,对 \(n\) 进行质因数分解,\(n=p_1^{c_1}\times p_2^{c_2}\times p_3^{c_3}\times \dots \times p_m^{c_m}\)。
假如 \(n\) 只有一个质因子 \(p\),则所有 \(1 \sim n\) 中 \(p\) 的倍数都不与 \(n\) 互质,可得 \(\varphi(n)=n-\dfrac{n}{p}\)。
假如 \(n\) 还有一个质因子 \(q\),\(\varphi(n)\) 还需要减去 \(\dfrac{n}{q}\),再加回被多减一次 \(p,q\) 共同的倍数个数 \(\dfrac{n}{pq}\) ,则:
推广到一般情况,可以推出:
特别地,\(\varphi(1)=1\)。
从另外一个角度理解这个柿子:对于 \(n\) 的一个质因子 \(p\),\(p\) 的倍数在 \([1,n]\) 中的占比为 \(\dfrac{\frac{n}{p}}{n}=\dfrac{1}{p}\),则其余的数字占比为 \(1-\dfrac{1}{p}\)。对于所有与 \(n\) 互质的数字 \(i\),两者没有共同的质因子。则与 \(n\) 互质的数字占比为 \(\prod_\limits{i=1}^m(1-\dfrac{1}{p_i})\),乘上 \(n\) 即为 \(\varphi(n)\) 的值。
\(\varphi(n)\) 可以用质因数分解 \(O(\sqrt{n})\) 求出。
性质
-
对于 \(\forall n>1\),在 \([1,n]\) 之间与互质 \(n\) 的数字之和为 \(\dfrac{n\varphi(n)}{2}\)。
- 对于 \(\forall i\) 满足 \(i \perp n\),\(\gcd(i,n)=\gcd(n-i,n)=1\)。也就是说,在 \([1,n]\) 之间与互质 \(n\) 的数字是成对出现的。由于上面的 \(i,n-i\) 的平均数为 \(\dfrac{n}{2}\),这些数字之和即为 \(\dfrac{n\varphi(n)}{2}\)。
-
\(\varphi(n)\) 是积性函数。
-
积性函数:若 \(a,b\) 互质,则 \(f(a)\times f(b)=f(ab)\)。
-
完全积性函数:对于 \(\forall a,b\in\mathbf{N_+}\),\(f(a)\times f(b)=f(ab)\)。
-
积性函数性质:对 \(n\) 进行唯一分解,\(n=\prod_\limits{i=1}^mp_i^{c_i}\),则有 \(f(n)=\prod_\limits{i=1}^m f(p_i)\)
-
性质 2 证明:由于 \(a,b\) 互质,则 \(a,b\) 没有共同的质因子。对 \(a,b\) 进行唯一分解得 \(a=\prod_\limits{i=1}^{m_1} p_i^{c_i},b=\prod_\limits{i=1}^{m_2}q_i^{c_i},ab=(\prod_\limits{i=1}^{m_1} p_i^{c_i})(\prod_\limits{i=1}^{m_2} q_i^{c_i})\) 。则有 \(\varphi(ab)=ab[\prod_\limits{i=1}^{m_1}(\dfrac{p_i-1}{p_1})\prod_\limits{i=1}^{m_2}(\dfrac{q_i-1}{q_1})]=\varphi(a)\varphi(b)\)。
-
-
设 \(n=p^k\)(\(p\) 是质数),则 \(\varphi(n)=p^k-p^{k-1}=p^{k-1}(p-1)\)。
- 由于 \(n\) 只有 \(p\) 一个质因子,则 \(1\sim n\) 之间与 \(n\) 不互质的数必定是 \(p\) 的倍数,这样的数共有 \(\dfrac{n}{p}=\dfrac{p^k}{p}=p^{k-1}\) 个。由此可得 \(\varphi(n)=n-p^{k-1}=p^k-p^{k-1}=p^{k-1}(p-1)\) 。
-
若 \(p\) 为质数,且 \(p\mid n\),则 \(\varphi(np)=p\varphi(n)\)。
- 容易得出,若对 \(n\) 与 \(np\) 分别做唯一分解,两个数的质因子集合相等。则有 \(\varphi(np)=np\prod_\limits{i=1}^m(\dfrac{p_i-1}{p_i})=p\varphi(n)\)。
-
若 \(p\) 为质数,且 \(p \nmid n\), 则 \(\varphi(np)=(p-1)\varphi(n)\)。
- 同样地,对 \(n\) 与 \(np\) 分别做唯一分解,\(np\) 的质因子集合比 \(n\) 的质因子集合多了一个 \(p\)。若 \(n=\prod_\limits{i=1}^m p_i^{c_i}\),则 \(\varphi(np)=np(\prod_\limits{i=1}^m \dfrac{p_i-1}{p_i})\dfrac{p-1}{p}=\varphi(n)(p-1)\)。
- 从另外一个角度考虑,\(p,n\) 一定是互质的,那么 \(\varphi(np)=\varphi(n)\varphi(p)=\varphi(n)(p-1)\)。
-
\(n=\sum_\limits{d\mid n}\varphi(d)\),也就是 \(n\) 的所有约数的欧拉函数值之和为 \(n\)。
-
设 \(f(n)=\sum_\limits{d|n} \varphi(d)\)。
-
设 \(n\perp m\),有 \(f(nm)=\sum_\limits{d\mid nm}\varphi(d)\)。对 \(n,m,d\) 进行唯一分解,\(d\) 的质因子一部分来自于 \(n\),一部分来自于 \(m\),且两部分没有交集。则 \(\forall d=xy\),其中 \(x\mid n,y\mid m,x\perp y\)。
由此进一步得到:\(f(nm)=\sum_\limits{d\mid nm}\varphi(d)=\sum_\limits{d\mid nm}\varphi(x)\varphi(y)=(\sum_\limits{d|n} \varphi(d))(\sum_\limits{d|m} \varphi(d))=f(n)f(m)\),则 \(f(n)\) 也为积性函数。
根据积性函数的性质,对 \(n\) 进行唯一分解,\(f(n)=\prod_\limits{i=1}^m f(p_i^{c_i})\),
而 \(f(p^k)=\sum_\limits{i=0}^k \varphi(p^i)=1+\sum_\limits{i=1}^k (p^i-p^{i-1})=1-1+p-p+p^2-p^2+\dots+p^k=p^k\),则 \(f(n)=\prod_\limits{i=1}^m p_i^{c_i}=n\)。
-
线性求欧拉函数
根据性质 4 与性质 5,在线性筛的基础上稍加修改即可。
void Solve(){
phi[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]){
prime.push_back(i);
phi[i]=i-1;
}
for(int j:prime){
if(i>n/j) break;
if(i%j==0){
phi[i*j]=phi[i]*j;
vis[i*j]=1;
break;
}
else{
phi[i*j]=phi[i]*(j-1);
vis[i*j]=1;
}
}
}
}
Ex.4 GCD SUM
利用欧拉函数的性质化简柿子:
线性求出 \(1\sim n\) 的欧拉函数值即可。
这种技巧也被称为 欧拉反演。
8.斐波那契与公约数
设斐波那契数列第 \(i\) 项为 \(f_i\)。
Lemma 1
Proof 1
数学归纳法。当 \(i=1\) 时, \(\gcd(f_1,f_2)=\gcd(1,1)=1\)。
设 \(f_k=a,f_{k+1}=b\),则有 \(f_{k+2}=a+b,f_{k+3}=a+2b\)。
利用更相减损术,可得:
于是我们得到
利用数学归纳,可以得到对于 \(i>1\) 的 \(i\),也满足 \(\gcd(f_i,f_{i-1})=1\)。命题得证。
Lemma 2
Proof 2
不妨假设 \(n<m\)。设 \(f_n=a,f_{n+1}=b\),则 \(f_{m}=f_{m-n-1}a+f_{m-n}b=f_{m-n-1}f_n+f_{m-n}f_{n+1}\)。
首先我们有
那么有
类似于辗转相除法,可以得到 \(\gcd(f_n,f_m)=\gcd(f_{\gcd(n,m)},f_1)=f_{\gcd(n,m)}\)。命题得证。
9.阶乘的素数幂次
设 \(p \in \mathbb{Prime}\),则有:
其中 \(v_p(x)\) 表示 \(x\) 中包含 \(p\) 的次数。
将 \(1\sim n\) 分开,\(v_p(n!)=\sum_{i=1}^n v_p(i)\)。
\(1\sim n\) 中至少包含一个 \(p\) 的数字有 \(\lfloor \dfrac{n}{p} \rfloor\),统计进答案中。\(1 \sim n\) 中至少包含 \(2\) 个 \(p\) 的数字有 \(\lfloor \dfrac{n}{p^2} \rfloor\) 个,但由于已经有一个 \(p\) 被统计过一遍,所以只需要再统计第 \(2\) 个质因子,答案加上 \(\lfloor\dfrac{n}{p^2}\rfloor\),系数为 \(1\)。
我们从另一个角度来计算。用 \(p\) 进制表示 \(n\),则有 \(n=\sum a_ip^i(0\leq a_i<p)\)。
其中 \(s_p(n)\) 表示 \(n\) 在 \(p\) 进制下各数位的数字之和。
10.Kummer 定理
在 \(p\) 进制下 \(n-m\) 与 \(m\) 相加,结果为 \(n\)。
设进位次数为 \(c\)。每进位一次,数位之和就会减少 \(p-1\),那么有
于是得到 \(\binom{n}{m}\) 中 \(p\) 的次数,就是 \(n-m\) 与 \(m\) 在 \(p\) 进制下相加进位次数。
同理可得, \(\binom{n}{m}\) 中 \(p\) 的次数就是 $n $ 与 \(m\) 在 \(p\) 进制下相减的借位次数。
若 \(\binom{n}{m}\) 在模 \(p\) 意义下为 \(0\),那么 \(n,m\) 在 \(p\) 进制下相减时至少产生了一次借位。
换句话说,如果在 \(p\) 进制下存在一位,使得 \(n\) 在这一位的值小于 \(m\) 在这一位的值,那么 \(\binom{n}{m} \bmod p\) 一定为 \(0\)。
由此可以快速判断 \(\binom{n}{m}\) 的奇偶性:设 \(n,m\) 在二进制下表示的集合为 \(S_n,S_m\),\(\binom{n}{m}\) 为奇数当且仅当 \(S_m \subseteq S_n\)。

浙公网安备 33010602011771号