数论算法集结

数论算法

看清楚限制条件!

费马小定理

\(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})\)

\[\sum_{n=1}^{N} (f*g)(n)=\sum_n\sum_{i\mid n} g(i)f(\dfrac{n}{i})\\ =\sum_i g(i)\sum_{n=1}^{\frac{N}{i}}f(n) \]

此时 \(S_f(n)\) 已经可以求。

\(g\) 的选择可以待定系数法。

  1. 计算 \(\sum_i \phi(i)⋅i\),取 \(g(i)=i\) 即可。
  2. 计算 \(\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\)

行列式求值

\[\text{det}(A)=|A|=\sum_p (-1)^{τ(p)}\prod_{i=1}^n a_{i,p_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\)

posted @ 2023-03-16 21:56  Network_Error  阅读(9)  评论(0)    收藏  举报