数论算法集结
数论算法
看清楚限制条件!
费马小定理
\(a^{p-1}\bmod p=1\ \ \ \ \ (p\in \text{Prime})\)
欧拉定理
\(a^{φ(p)}\bmod p=1\ \ \ \ \ (\gcd(a,p)=1)\)
证明可以取 \(1\sim p-1\) 内和 \(p\) 互质的所有数,把它们 \(\times a\) 后仍然对应着 \(1\sim p-1\) 内和 \(p\) 互质的所有数,列个等式,解得 \(a^{φ(p)}\bmod p=1\)。
扩展欧拉定理
- \(a^{b}\bmod p=a^b\bmod p\ \ \ \ \ (b<φ(p))\)
- \(a^{b}\bmod p=a^{(b\bmod{φ(p)})+φ(p)}\bmod p\ \ \ \ \ (b\ge φ(p))\)
证明,把 \(p\) 分解质因数后分类讨论即可。
卢卡斯定理
\(\dbinom{a}{b}\bmod p=\dbinom{a\bmod p}{b\bmod p}\cdot \dbinom{\frac{a}{p}}{\frac{b}{p}}\bmod p\ \ \ \ \ (p\in \text{Prime})\),除法下取整。
证明,通过拆取模二项式再看特定数的系数可得。
由此可得一条重要性质:\(\dbinom{a}{b}\bmod 2=1\) 当且仅当 \(b\) 是 \(a\) 的子集,证明。
中国剩余定理
求同余方程最小解,要求 \(m_i\) 两两互质。
记 \(M=\prod m_i\),\(p_i=M/m_i\) 关于 \(m_i\) 的逆元,答案即为 \((\sum_i b_i\cdot m_i\cdot p_i)\bmod M\)。
二元一次不定方程 ExGCD
求 \(ax+by=c\) 的解的数量,所有解中 \(x,y\) 的最小最大值。
void exgcd(int a, int b, int &x, int &y) {
if (!b) {
x = 1, y = 0; return;
}
exgcd(b, a % b, x, y);
int t = x;
x = y, y = t - a / b * y;
}
求 \(ax+by=\gcd(x,y)\) 的一组特解 \((x_0,y_0)\)。
那么 \((x_1,y_1)=(x_0\times \dfrac{c}{\gcd(x,y)}, y_0\times \dfrac{c}{\gcd(x,y)})\) 即为 \(ax+by=c\) 的一组特解。
考虑任意一组解,一定可以表示为 \(a(x_1+d\times b)+b(y_1-d\times a)=c\),\(db,da\in \text{Z}\)。
求出最小的 \(d=\dfrac{1}{\gcd(a,b)}\),其他的一定是这个数的倍数。
\(s\ge\dfrac{-x_1+1}{bd}\) 上取整,\(s\le\dfrac{y_1-1}{ad}\) 下取整。
推式相关
耿利克雷卷积
- \(\mu * I=ε\)
- \(\phi * I=\text{Id}\)
- \(\mu * \text{Id}=\phi\)
莫比乌斯反演
\(f(n)=\sum_{d\mid n}g(d)\to g(n)=\sum_{n\mid d}\mu(\dfrac{d}{n})f(d)\)。
因为:\(f=g*I\to f*\mu=g*(I*\mu)\to f*\mu=g*ε=g\)。
莫比乌斯反演,本质是卷积。所以,所有莫比乌斯反演,等价于用卷积来做!!
推式技巧
- 增加枚举量(枚举 \(\gcd\)、枚举 \([E]\))
- 交换求和符号
- 分离无关变量(\(\sum_i\sum_j ij=(\sum_i i)\times(\sum_j j)\))
- 换元(\(\sum_i\sum_j f(i)\dfrac{N}{ij}=\sum_x\dfrac{N}{x}\sum_{i\mid x}f(i)\))
- 套用卷积形式(反演)
杜教筛
筛积性函数的前缀和,复杂度 \(\mathcal{O}(n^{0.666\cdots})\)。
此时 \(S_f(n)\) 已经可以求。
\(g\) 的选择可以待定系数法。
- 计算 \(\sum_i \phi(i)⋅i\),取 \(g(i)=i\) 即可。
- 计算 \(\sum_i \phi(i)i^2\),取 \(g(i)=i^2\)。
矩阵相关
高斯消元 / 矩阵求逆 / 行列式求值
本质都是消元。
矩阵乘法不满足交换律。
矩阵求逆
求 \(A^{-1}\),\(A\times A^{-1}=I\),且 \(A^{-1}\times A=I\)。
矩阵求逆。
证明:
考虑矩阵 \(A\times B=C\)。
有性质:
- 将 \(A\) 一行 \(\times v\),\(C\) 同一行也 \(\times v\),仍有 \(A\times B=C\)。
- 将 \(A\) 一行对于减去另一行,\(C\) 同样操作,仍有 \(A\times B=C\)。
求 \(A^{-1}\),拼接 \([A\ I]\),消得 \([I\ A^{-1}]\)。
消前有 \(I\times A=A\)。由于消元的每一步都同样满足大矩阵的右半边 \(\times A=\) 左半边,最后有 \(A^{-1}\times A=I\)。
https://zhuanlan.zhihu.com/p/113138069
有 \(A\times A^{-1}=I\)。
行列式求值
求
\(τ(p)\):逆序对数。
也就是从每一行选不重复的一列,元素的积的和。
可以用类似的方法消元得到。
拉格朗日插值
性质:\(\sum_i i^k\) 是 \(k+1\) 次多项式。
素数相关
Miller-Rabbin 快速素性检验
const int prm[523] = {2, 3, 5, 13, 17, 31, 37};
bool MR(int x, int p) {
if (x == p) return 1;
if (x % p == 0) return 0;
if (power(p, x - 1, x) != 1) return 0;
int h = x - 1;
while (h % 2 == 0) {
h >>= 1; int t = power(p, h, x);
if (t != 1 && t != x - 1) return 0;
if (t == x - 1) break;
}
return 1;
}
bool chk(int n) {
if (n <= 1) return 0;
for (int i = 0; i < 7; i++) {
if (!MR(n, prm[i])) return 0;
}
return 1;
}
Pollard-Rho
咕!
组合计数
*组合恒等式
- \(\dbinom{n}{i}=\dbinom{n}{n-i}\)
- \(\sum_{i=0}^n \dbinom{n}{i}=2^n\)
- \(\dbinom{n}{x}\dbinom{x}{y}=\dbinom{n}{y}\dbinom{n-y}{x-y}\)
- 平行恒等式:\(\sum_{i=0}^n\dbinom{i}{r}=\dbinom{r}{r}+\dbinom{r+1}{r}+\dbinom{r+2}{r}+\cdots+\dbinom{n}{r}=\dbinom{n+1}{r+1}\)
- 斜升恒等式:\(\sum_{i=0}^n\dbinom{r+i}{i}=\dbinom{r+n+1}{n}\)
练习:
- \(\sum_{i=1}^n\dbinom{n}{i}^2=\dbinom{2n}{n}\)
错排
\(f(n)=(n-1)(f(n-1)+f(n-2))\)。
卡特兰数
长度为 \(2n\) 的括号序列个数。
\(C(n)=\dbinom{2n}{n}+\dbinom{2n}{n+1}=\dfrac{1}{n+1}=\dfrac{(2n)!}{(n+1)!n!}\)。
通过 \(y=-1\) 这条直线翻转映射证明。
这是一类映射思想:折线法。
斯特林数
第一类斯特林数
\(s(n,k)=\) 将 \(n\) 个两两不同的元素,划分为 \(k\) 个互不区分的非空圆排列的方案数。
\(s(n,k)=s(n-1,k-1)+(n-1)\cdot s(n-1,k)\)。
第二类斯特林数
\(S(n,k)=\) 将 \(n\) 个两两不同的元素,划分为 \(k\) 个互不区分的非空集合的方案数。
\(s(n,k)=s(n-1,k-1)+k\cdot s(n-1,k)=\dfrac{1}{k!}\sum_{i=0}^k (-1)^i\dbinom{k}{i}(k-i)^n\)。