写的太急,不润色了
博客园先行更新,欢迎提出建议
欧拉筛
每个数只被最小的质因数遍历,
利用遍历时的两数关系(是否互质)可以求解各种约数信息与积性函数信息。
最大公约数
\(\gcd(x,y)=\gcd(x\bmod y,y)=\gcd(y,x\bmod y)\)
同时,在这个过程中,我们可以用exgcd求解方程 \(ax+by=gcd(a,b)\) 的解。
过程:
\[设ax_1+by_1=\gcd(a,b),\\
bx_2+(a\bmod b)y_2=\gcd(b,a\bmod b)\\
\\
\because \gcd(a,b)=\gcd(b,a\bmod b)\\
\therefore ax_1+by_1=bx_2+(a\bmod b)y_2\\
又\because a\bmod b=a-\left(\left\lfloor\frac ab\right\rfloor \cdot b\right)\\
\therefore ax_1+by_1=bx_2+\left(a-\left(\left\lfloor\frac ab\right\rfloor \cdot b\right)\right)y_2\\
\therefore ax_1+by_1=ay_2+bx_2-\left\lfloor\frac ab\right \rfloor \cdot by_2\\
=ay_2+b\left(x_2-\left\lfloor\frac ab\right\rfloor y_2\right)\\
\because a=a,b=b\\
\therefore x_1=y_2,y_1=x_2-\left\lfloor\frac ab\right\rfloor y_2
\]
为此,我们可以求出它的一组特定解。
int exgcd(int a, int b, int &x, int &y) //返回gcd值,x,y值
{
if (!b)
{
x = 1, y = 0; // ax=a
return a;
}
int g = exgcd(b, a % b, y, x);
y -= x * (a / b);
return g;
}
利用
费马小定理
对于素数 \(p\),有
\[a^{p-1}\equiv 1\mod p
\]
证明:
\[\forall 1\le x,y < n,x\ne y:ax\not\equiv ay\mod p
\\
证明:当ax\equiv ay\\
ax-ay\equiv a(x-y) \equiv 0\mod p\\
x\equiv y\mod p,矛盾\\
\\
\because ax\not \equiv ay\\
\therefore \prod_{x=1}^{p-1} \equiv \prod_{x=1}^{p-1} ax\mod p\\
\therefore \prod_{x=1}^{p-1} \equiv a^{p-1}\cdot \prod_{x=1}^{p-1}x\mod p\\
\therefore (a^{p-1}-1)\cdot \prod_{x=1}^{p-1}\equiv 0 \mod p\\
\therefore a^{p-1}-1\equiv 0\mod p\\
\therefore a^{p-1}\equiv 1\mod p
\]
模意义逆元
指一个数 \(b\) 满足 \(ab\equiv 1\mod p\),这让 \(b\) 等价于 \(a^{-1}\).
根据线性同余方程,有逆元的充要条件是 \((a,p)=1\).
利用费马小定理,可以解决 \(p\) 为素数的逆元问题.
\[a\cdot a^{p-2} \equiv 1\mod p\\
a^{p-2}即为逆元
\]
线性同余方程
\(ax\equiv b\mod m\)
当 \((a,m)=1\) 时, \(x\equiv a^{-1}b\mod m\)
可是不互质呢?
我们可以发现,这等价于 \(ax + my = b\).如何解这个方程?
二元一次不定方程
当 \((a,b)=1\) 时,
有特解 \(a\cdot x_0+b\cdot y_0=1\)
然后,解可表示为
\[\left\{\begin{matrix}
x=x_0+k\cdot b
\\
y=y_0-k\cdot a
\end{matrix}\right.
\\
k为整数
\]
证明
易知这必然为答案。
接下来证除这种形式无其它解。
详情
\[\because \left\{\begin{matrix}
ax+by=1
\\
ax_0+by_0=1
\end{matrix}\right.
\\
\therefore
\left\{\begin{matrix}
a_x\equiv 1\mod b
\\
a_{x_0}\equiv 1\mod b
\end{matrix}\right.
\therefore a(x-x_0)\equiv 0 \mod b
\\
\therefore x\equiv x_0\mod b
\]
一般形式
\(ax+by=c\) 何时有解?
只有当 \(c\) 是 \(d=(a,b)\) 的倍数才可以。
证明
* 此时有解。
\(a\cdot x_0\frac cd+b\cdot y_0\frac cd = c\).
裴蜀定理(Bézout's lemma): 集合 \({ax+by}\) 与 \({k\gcd(a,b)}\) 相同
特解:
我们首先用 exgcd 求出 \(ax+by=d\) 的解 \(x_0,y_0\)。
\[ax_0+by_0=d\\
ax_0\cdot \frac cd+by_0\cdot \frac cd=c\\
a\frac {x_0c}d+by_0\cdot \frac{y_0c} d=c
\]
此时,方程 \(ax+by=c\) 的特解 \(x_0',y_0'\) 可以表示为
\[x_0'=x_0\cdot \frac cd\\
y_0'=y_0\cdot \frac cd
\]
通解:
\[ax+by=c
\\
x_0'=x_0\cdot \frac c d\\
y_0'=y_0\cdot \frac c d\\
x_0'+by_0'=c\\
x\equiv x_0'\mod \frac b d\\
\left\{\begin{matrix}
x=x_0'+k\cdot \frac bd
\\
y=y_0'-k\cdot \frac ab
\end{matrix}\right.
\]
回到原来方程,它可以转为 \(ax+my=b\) 。这就与刚才一样了。
最终通解为
\[x\equiv x_0'\mod \frac m {(a,m)}
\]
线性同余方程组
问题:解形如如下形式的同余方程
\[\left\{\begin{matrix}
x\equiv a_1\mod p_1
\\
x\equiv a_2\mod p_2
\\
\vdots
\\
x\equiv a_n\mod p_n
\end{matrix}\right.
\]
何时有解?通解如何表示?
简单形式
当 \(p_i\) 均为质数时,我们有中国剩余定理。
我们可以找 \(x_1\) 满足
\[\left\{\begin{matrix}
x_1\equiv1\mod p_1
\\
x_1\equiv 0 \mod p_2
\\
\vdots
\\
x_1\equiv 0 \mod p_n
\end{matrix}\right.
\]
容易发现,令 \(m=p_2\cdot p_3\cdot \dots \cdot p_n\) 时, \(x_1=m\cdot(m^{-1})\mod p_1\).
\(x_j\) 均可如此求。
此时便能找到特解 \(x'=\sum_{i=1}^n a_i\cdot x_i\)\
通解为 \(x\equiv x'\mod \prod_{i=1}^np_i\)
一般形式
当 \(p_i\) 两两互质,也可以得到同样的结果。此时,问题只在求逆元。我们不能用简单的费马小定理,只能解同余方程。
!!!EX CRT扩展中国剩余定理
对于任意 \(m_i\) 的同余方程组
\[\left\{\begin{matrix}
x\equiv a_1\mod m_1
\\
x\equiv a_2\mod m_2
\end{matrix}\right.
\]
我们可以得到 \(x=a_1+p_1m_1=a_2+p_2m_2\).
\(p_1m_1+p_2m_2=a_1-a_2\)
所以 \(p_1=p_1'+k\frac {m_2}{(m_1,m_2)}\), \(p_1'\)可用exgcd求解
利用这一点,我们可以得到 \(x_0=a_1+p_1m_1=a_1+m_1\left (p_1'+k\frac{m_2}{(m_1,m_2)}\right )\)
故通解 \(x\equiv \frac{a_1+m_1p_1'}{x_0}\mod \frac{m_1m_2}{(m_1,m_2)}\)
注意,当 \(a_2-a_1 \nmid (m_1,n_2)\) 时无解。
我们称其为 扩展中国剩余定理。
对于
\[\left\{\begin{matrix}
x\equiv a_1\mod m_1
\\
x\equiv a_2\mod m_2
\\
\vdots
\\
x\equiv a_n\mod m_n
\end{matrix}\right.
\]
我们可以两两合并求解。
再扩展,
\[\left\{\begin{matrix}
A_1x\equiv B_1\mod m_1
\\
A_2x\equiv B_2\mod m_2
\\
\vdots
\\
A_nx\equiv B_n\mod m_n
\end{matrix}\right.
\]
我们可以把每一项基于exgcd求出
数论函数
值域为(正)整数(一般来说为正整数,为满足逆元可能扩充域),与同余有关
数论函数有加法: \((f+g)(n)=f(n)+g(n)\)
算法竞赛常见数论函数有 \(1(n)=1,\varepsilon(n)=[n=1],id(n)=n,\varphi(n),\mu(n)\)
欧拉函数
记作 \(\varphi(x)\),函数值为 \(\varphi(x)=\sum_{1<i<x}[(i,x)=1]\),即 \(x\) 以下与 \(x\) 互质数的个数。
欧拉函数可以表示为 \(\varphi(x)=m\cdot \prod_{p\mid x}{1-\frac 1p}\)
欧拉函数是积性函数(\(\varphi(a\cdot b)=\varphi(a)\cdot\varphi(b)\))。
欧拉函数有 \(\varphi(\frac nd)=\sum_{i=1}^{\frac nd}[\gcd(i,\frac nd)=1]\) 和 \(\sum_{d\mid n} \varphi(d)=n\) 的性质。
第一条
第二条
\[n=\sum_{d\mid n}\sum_{i=1}^n[\gcd(i,n)=d]=\sum_{d\mid n}\varphi(\frac nd)=\sum_{d\mid n} \varphi(d)
\]
欧拉定理
对费马小定理的扩展。
\[a^b\equiv a^{b\bmod \varphi(m)}\mod m \ \ \ \gcd(a,b)=1
\]
扩展欧拉定理
\[\left \{ \begin{matrix}
a^b\equiv a^{b\bmod \varphi(m)}&\mod m &(a,m)=1 \\
a^b\equiv a^b&\mod m &b<\varphi(m) \\
a^b\equiv a^{(b\bmod \varphi(m))+\varphi(m)}&\mod m & b\ge \varphi(m)\\
\end{matrix} \right .
\]
该定理在形如 \(a_1^{a_2^{...}} \bmod m\) 的幂塔 上降幂有很大作用,因为可以证明对一个数 \(x\),取 \(\varphi(\varphi(...\varphi(x)...))\) 的值,只用取 \(\log x\) 的量级次。一般来说,我们只需要对每一组模数 \(m\) 预处理 \(\varphi(m),\varphi(\varphi(m)),...\),不怎么需要线性筛。
需要注意的是,在有限次幂上,不能保证 \(b\ge \varphi(m)\) 时,要特意处理,这也是主要难点之一。
卷积
对于数论函数 \(f_1,f_2\) 形如 \(f_1(x)=a_0x^0+a_1x^1+...+a_nx^n,f_2(x)=b_0x^0+b_1x^1+...+b_nx^n\),有卷积后的函数 \(F=f_1\cdot f_2=a_0b_0x^0+a_0b_1x^1+......\) (多项式乘法)
我们可以看系数集的关系。这样可以得到
\[F(x)=\sum_{i=0}^{\infty}\left(\sum_{j+k=i}a_j\cdot b_k\right) x^i
\]
类似地,我们定义序列 \(A,B\) 卷积为 \((A*B)_i=\sum_{j+k=i}a_j\cdot b_k\),也就对应刚刚函数 \(i\) 次项系数。
把这个卷积运算推广到数论函数。
\[h=f*g\\
h(n)=\sum_{i+j=n}f(i)g(j)
\]
可是这样我们就失去了大部分数论函数的数论特点(如积性),原因是因为唯一分解形式上出现加法
Dirichlet 卷积
我们这样定义数论函数卷积:
\[h(n)=(f*g)(n)=\sum_{i\cdot j=n}f(i) g(j)
\]
它等价于
\[h(n)=(f*g)(n)=\sum_{d\mid n} f(d) g(\frac nd)
\]
- \(h\) 仍为数论函数
- 它满足结合律
- 它满足交换律
- 它甚至满足 \((f_1+f_2)*f_3=f_1*f_3+f_2*f_3\) 的分配律
- 逆元 \(\exists g=f^{-1}\)
- 仍保持数论函数的积性(逆元也满足)(不满足完全积性)
- 存在单位元 \(\varepsilon (n)=[n=1]\) 满足 \(f*\varepsilon =\varepsilon *f=f\)
其中,逆元有很重要的作用,这里必须讲一讲
存在条件:\(f(1)\ne 0\)
形式:
\[g(1)=\frac 1{f(1)}\\
g(n)=\frac{\varepsilon(n)-\sum_{d>1,d\mid n} f(d)\cdot g(\frac nd)}{f(1)}
\]
注意,当 \(f(1)\ne 1\) 时,逆元可能不在整数域。不过,积性函数都满足 \(f(1)=1\)。因为 \(f(n)=f(n)\cdot f(1)\)
其余性质的证明
数论函数是比较显然的
交换律:
\[f*g=g*f\\
\sum_{d\mid n}f(d)g(\frac nd)=\sum_{\frac nd\mid n} f(\frac nd)g(d)
\]
结合律:
\[(f*g)*h=f*(g*h)\\
(f*g)*h=f*g*h=g*h*f=(g*h)*f=f*(g*h)
\]
分配律
\[(f+g)*h=f*h+g*h\\
(f+g)*h(n)=\sum_{ij=n}(f+j)(i)h(j)=\\
\sum_{ij=n}(f+g)(i)\cdot h(j)=\\\sum_{ij=n}f(i)h(j)+\sum_{ij=n}g(i)h(j)\\
(f*h+g*h)(n)=(f*h)(n)+(g*h)(n)=\\\sum_{ij=n}f(i)h(j)+\sum_{ij=n}g(i)h(j)
\\\therefore (f+g)*h=(f*h+g*h)
\]
逆元:待补,,,
积性
\[\begin{array}{c}
h(a)\cdot h(b) = \left(\sum_{d_1\mid a}f(d_1)g(\frac {d_1}a)\right)\cdot \left(\sum_{d_2\mid a}f(d_2)g(\frac {d_2}a)\right)\\ = \sum_{d_1\mid a, d_2\mid b} f(d_1d_2)g(\frac{ab}{d_1d_2})&(必须满足ab互质)\\ = \sum_{d\mid ab} f(d)g(\frac{ab}d) = h(ab)
\end{array}
\]
逆元积性
\[归纳
\\g(1)=g(1)\cdot g(1)
\\根据定义,g(n_1n_2)=-\sum_{d>1,d\mid n_1n_2}f(d)g(\frac nd)
\\
令d=d_1\cdot d_2,d_1\mid n_1,d_2\mid n_2
\\
原式=\sum_{d_1\mid n_1,d_2\mid n_2} f(d_1d_2)\cdot g(\frac {n_1n_2}{d_1d_2})\\
=\sum_{d_1\mid n_1,d_2\mid n_2} f(d_1)f(d_2)g(\frac{n_1}{d_1})g(\frac{n_2}{d_2})\\
=f(1)f(1)g(n_1)g(n_2)-\sum_{d_1\mid n_1,d_2\mid n_2}f(d_1)f(d_2)g(\frac {n_1}{d_1})g(\frac {n_2}{d_2})\\
=g(n_1)g(n_2)-\left(\sum_{d_1\mid n_1}f(d_1)g(\frac {n_1}{d_1})\right)\left(\sum_{d_2\mid n_2}f(d_2)g(\frac{n_2}{d_2})\right)\\
=g(n_1)g(n_2)-(f*g)(n_1)\cdot (f*g)(n_2)\\=g(n_1)g(n_2)-\varepsilon(n_1)\varepsilon(n_2)\\
=g(n_1)g(n_2)
\]
最后一步中,因为 \(n_1n_2>1\),所以 \(\varepsilon(n_1)\) 和 \(\varepsilon(n_2)\) 中必有 \(0\)。
完全积性证伪:
\[f(1)=1,f(p)=a,f(p^2)=a^2\\
g(1)=1,g(p)=b,g(p^2)=b^2\\
h=f\ast g\\
h(p)=f(1)g(p)+f(p)g(1)=a+b\\
h(p^2)=f(1)g(p^2)+f(p^2)g(1)+f(p)g(p)=a^2+ab+b^2\\\ne h(p)^2=a^2+2ab+b^2
\]
莫比乌斯函数
Mobius函数的定义是
\[\mu(n)=\left\{\begin{matrix}
1&n=1\\0&\exist p:p^2\mid n\\(-1)^k&n=p_1p_2p_3\dots p_k\\
\end{matrix}\right.
\]
分类讨论易知它为积性函数。
同时,还有定义 \(\mu=1^{-1}\)
Mobius 函数有重要性质:
\[\sum_{d\mid n} \mu(d)=[n=1]\Longleftrightarrow \mu*1=\varepsilon
\]
证明
\[n=\prod_{i=1}^kp_i^{\alpha_i}\\
\varepsilon (n)=[n=1]\\
=\sum_{i=0}^k(-1)^i\left(^k_i\right)=(1+(-1))^k\\=[k=0]=[n=1]
\]
类似第二式变形,我们有
\[\sum_{d\mid n}\varphi(d)=n\Longleftrightarrow \varphi * 1=id
\]
对它恒等变形
\[\varphi * 1 * 1^{-1}=id*1^{-1}\\
\varphi=id*\mu
\]
而对我们Mobius的性质变形,就是:
莫比乌斯反演
看看如下转换:
\[f(n)=\sum_{d\mid n} g(d)\\
f=g*1\\
f*\mu=g\\
g(n)=\sum_{d\mid n}f(d)\mu(\frac nd)
\]
我们称其为反演公式。
如果我们把函数 \(f,g\) 用向量的映射形式 \(\vec{f},\vec{g}\) 表示,就会发现它们可以乘上一个固定的转移矩阵 \(A\),而且其存在逆。
\[A\cdot \vec{g}=\vec{f}\\
\vec{g}=A^{-1}\cdot \vec{f}
\]
关于矩阵 \(A\) 的求解,我们有公式:
\[A_{n,d}=[d\mid n]\\
A_{n,d}^{-1}=[d\mid n]*\mu(\frac nd)
\]
反演式可以用来加速这个矩阵(逆)的求解。
例题
求
\[\sum_{i=1}^n\sum_{j=1}^m\gcd(i,j)
\]
一般解
\[原式=\sum_{i=1}^n\sum_{j=1}^m\sum_{d\mid i, d\mid j} \varphi(d)\\
=\sum_{d=1}^n\varphi(d)\lfloor \frac nd\rfloor\lfloor \frac md\rfloor
\]
Mubius求法:
\[原式=\sum_{d=1}^n\cdot \sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=d]\\
=\sum_{d=1}^nd\cdot \sum_{i=1}^{\lfloor\frac nd\rfloor}\sum_{j=1}^{\lfloor\frac md\rfloor}[\gcd (i,j)=1]\\
=\sum_{d=1}^nd\cdot\sum_{x=1}^{\lfloor\frac{n}{d}\rfloor} \mu(x)\cdot \sum_{i=1}^{\lfloor\frac nd\rfloor}\sum_{j=1}^{\lfloor\frac md\rfloor}\sum_{x\mid i,x\mid j}[x\mid i][x\mid j]\\
=\sum_{d=1}^nd\cdot \sum_{x=1}^{\lfloor\frac{n}{d}\rfloor} \mu(x)\lfloor \frac n{dx}\rfloor\lfloor \frac m{dx}\rfloor\\
令T=dx\\
上式=\sum_{T=1}^n(\sum_{d\mid T}d\mu(\frac Td))\lfloor \frac n{T}\rfloor\lfloor \frac mT\rfloor\\
=\sum_{d=1}^n\varphi(d)\lfloor \frac nd\rfloor\lfloor \frac md\rfloor
\]
简单版:SDOI2008仪仗队
求
\[\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)
\]
\[原式=\sum_{i=1}^n\sum_{j=1}^m\frac{ij}{\gcd(i,j)}
\\
=\sum_{d=1}^n\sum_{i=1}^n\sum_{j=1}^m\frac{ij}{d}[\gcd(i,j)=d]\\
=\sum_{d=1}^nd\cdot \sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor} ij[\gcd(i,j)=d]\\
=\sum_{d=1}^nd\cdot \sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor} ij\sum_{x\mid i,x\mid j} \mu(x)\\
=\sum_{d=1}^n d\cdot \sum_{x=1}^{\lfloor\frac{n}{d}\rfloor} x^2\mu(x)\sum_{i=1}^{\lfloor \frac{n}{dx}\rfloor}\sum_{j=1}^{\lfloor \frac m{dx}\rfloor}ij\\
令S(n)=1+2+3+...+n=\frac{n(n+1)}2, T=dx\\
上式=\sum_{d=1}^n d\cdot \sum_{x=1}^{\lfloor\frac{n}{d}\rfloor} x^2\mu(x)S(\lfloor\frac{n}{dx}\rfloor)S(\lfloor\frac{m}{dx}\rfloor)
\\
=\sum_{T=1}^nS(\lfloor \frac nT\rfloor)S(\lfloor \frac mT\rfloor)(\sum_{x\mid T} x\mu(x))\\
其中,h(T)=\sum_{x\mid T} x\mu(x)是积性函数,所以可以求。原因:\\
令h=g*1,满足g(x)=x\cdot \mu(x) ,易知g为积性,故h积性
\]
整除分块
不知道放哪的杂项,单独分一类
我们计算时常常遇到形如 \(\sum \left \lfloor \frac {n}{i} \right \rfloor\) 的式子。刚好,我们有一种 \(\Theta(n)\) 时间复杂度的算法:整除分块
我们知道, \(\left \lfloor\frac{n}{i}\right\rfloor\) 的取值在 \(\sqrt n\) 级别。理由:
- \(i\le \sqrt n\) ,此时有 \(\sqrt n\) 种取值
- \(i>\sqrt n\),此时 \(\left \lfloor\frac{n}{i}\right\rfloor \le \sqrt n\)。
整除分块就是求对于 \(l\),找最大的 \(r\) 满足 \(\left \lfloor\frac{n}{l}\right\rfloor=\left \lfloor\frac{n}{r}\right\rfloor\)
设这个等式两边的值为 \(k\),则
\[\left \lfloor \frac nr\right \rfloor=k\Longleftrightarrow k\le \frac nr<k+1\\
n\le\frac nk
\\
r_{\max}=\left \lfloor \frac nk\right \rfloor
\]
当然这只适用于部分情况。有时候不等号方向会改变,需要我们同时讨论两个界来求最大或最小。向上取整也一样。
如果我们要求 \(\sum \lfloor\frac ni\rfloor \lfloor \frac mi \rfloor\) 呢?
我们分别计算 \(r_n,r_m\) 表示不同的 \(r_{\max}\),能发现取 \(\min(r_n,r_m)\) 就可以得到答案。
一般来说,我们可以用这种方式在 \(\Theta(\sqrt n)\) 的时间复杂度内解决包含向下取整的问题。