数论集合笔记
搬自原洛谷博客。
这次补的是之前的笔记。
有关质数
含有算法介绍
Chapter I 除法
大家都知道小学除法罢。除非你幼儿园大班就考CSP提高
小学除法长这样:\(n \div p =k \dots r\)
但是OI常用的带余除法,也就是欧几里得除法,长这样: \(n=p\times k+r\)
(原始有意义的情况下势必存在解)
- 唯一性(只有一个解)
给定整数 \(n\)(被除数)和非零整数 \(p\) (除数),存在唯一的整数 \(k\) (商) 与 \(r\)(余数),其中 \(0\le r < |p|\)
其中\(k=\left\lfloor\dfrac{n}{p}\right\rfloor , r = n \mod p\)
例如:-5/3向下取整=-2,向零取整=-1
那%是啥意思?a%b等价于a膜拜b?
c++中的%
为取模运算
在c++中,%
运算符的运行规则为取余
两数取余,结果符号看被除数
e.g.
5%3=2
5%-3=2
-5%3=-2
-5%-3=-2
所以在取模的时候不需要考虑除数的正负情况。但请注意防爆和题目限制!
-
有些时候题目的
玄学限制可能会导致%一个负数的答案仍然是错的。 -
小心类型溢出
-
当式子里出现减法运算或各个参数/变量中有负数的时候,参考第一条,万分小心,同时注意这个参数/变量的正负是否会影响其他的因素。
- 而对于 \(\gcd\) (手打辗转相除法)而言,由于内部含有取模运算符
%
,其大致情况是这样的:
int gcd(int a,int b){
if(b==0){
return a;
}
else{
return gcd(b,a%b);
}
}
gcd(12,-8)=4
gcd(-12,8)=-4
gcd(-12,-8)=-4
gcd(8,-12)=-4
gcd(-8,12)=4
gcd(-8,-12)=-4
你猜对了吗?真聪明!清华北大不是梦
Chapter II 整数唯一分解定理
- 算术基本定理
任意 \(\ge 1\) 的自然数 \(n\) 都可以唯一地分解为有限个质数的乘积。
其中 \(p_1 < p_2 < \dots < p_k\) ,\(r_i\) 为正整数
上述式子也被称为\(n\)的标准分解式
这个定理可以把对自然数的研究转换成对质数的研究,且不需要分类讨论——因为是唯一的。
gcd和lcm在整数唯一分解定理中的应用
\(\gcd(a,b) = p_1^{\min(r_{a_1},r_{b_1})} \times p_2^{\min(r_{a_2},r_{b_2})} \times \dots \times p_k^{\min(r_{a_k},r_{b_k})}\)
\(lcm (a,b) = p_1^{\max(r_{a_1},r_{b_1})} \times p_2^{\max(r_{a_2},r_{b_2})} \times \dots \times p_k^{\max(r_{a_k},r_{b_k})}\)
公式太大,只能开大标题了
- 整数唯一分解定理和欧拉函数 \(\varphi\)
欧拉函数的定义详见这里的Chapter IV
- 整数唯一分解定理和约数个数 \(d\)
\(d_n = (r_1+1)\times (r_2+1)\times \dots (r_k+1)\)
- 整数唯一分解定理和约束和 \(\sigma\)
\(\sigma_n = (1 + p_1 + p_1^2 + \times + p_1^{r_1}) \times (1 + p_2 + p_2^2 + \times + p_2^{r_2}) \times (1 + p_n + p_n^2 + \times + p_n^{r_n})\)
分解质因数的方法
方法1
利用性质:
- \(n\)最多只含1个大于 \(\sqrt{n}\) 的质因子
流程:
- 试除 \(2\) ~ \(\sqrt{n}\) 内的质数
时间复杂度:\(O(\sqrt{n})\)
适用范围:
-
时间限制非常宽松
-
需要简单快速的代码实现
-
像CF等的手速赛。
-
小型数据范围
优点:
-
简单方便
-
空间需求低
缺点:
- 时间需求高,多半不稳
方法2
利用性质:
- \(\pi(n)\) ~ \(\dfrac{n}{\ln n}\)
流程:
-
预处理 \(1\) ~ \(\sqrt{n}\) 内的质数(使用线性筛)
-
分解时仅仅试除质数
时间复杂度: \(O(\sqrt{n})/O(\dfrac{\sqrt{n}}{\log n })\)
适用场景:
-
\(n \le 10^9\) ~ \(10^{14}\)
-
时间限制比较紧,且算法1不稳的时候
优点:
-
思路比较直白
-
相对于大数据而言在时间方面提供了强有力的制裁
-
记录质数可以直接使用线性筛里用来记录质数的数组
-
大型数据范围
缺点:
-
极限数据下非常不稳
-
数据中小的情况下不能发挥时间上的制裁优势
关于线性筛法:
时间复杂度分析在这里的Chapter V
代码在这里的Chapter I
线性筛思路:
-
每个合数被他的最小质因数筛去。
-
如果一个数内部含有两个相同的质因数就可以
滚蛋下一个了。 -
第二条在代码里的实现即为
i % p[j] == 0
,也就是( i * p[j] ) % ( p[j] * p[j] ) == 0
方法3
利用性质:
- 整数唯一分解定理
流程:
-
线性筛的时候记录每个数最小的质因数
-
分解时直接除掉最小质因数
时间复杂度:\(O(n)/O(\log n)\)
适用场景:
-
\(n \le 10^6\) ~ \(10^7\)
-
分解次数较多,时间限制紧,极限数据下、算法2不稳的时候。
优点:
-
耐分解,次数多不怕
-
比较稳定
-
思路比较直白(分解质因数的方法都™直白)
-
中型数据范围
缺点:
- 需要多开一个
minprime
数组来记录每个数的最小质因数
方法4
Phollard-Rho算法
-
基于
玄学随机化的质因数分解算法。 -
一场胜率很大的赌博——很大的概率分解对。
-
期望时间复杂度: \(O(n^\frac{1}{4})\)
-
适用场景:\(n \le 10^{18}\)
同样随机化的素数检测算法是Miller-Rabin
- 当判定16个质数时,只有\(\dfrac{1}{4\times 10^6}\)的概率判错
找约数
问题:如何高效地找到 \(n\) 的所有约数
\(\displaystyle d | n \Rightarrow \frac{n}{d} | n\)
方法1
利用性质:
- 无
流程:
- 试除 \(1\) ~ \(\sqrt n\) 内的整数
时间复杂度: \(O(\sqrt n)\)
适用场景:
-
其他方法写不了了
-
空间卡的逆天
-
题目的时间限制特别宽松,不值得在这个题上优化(优化约等于浪费时间的情况)
-
脑子抽抽只会暴力了
优点:
-
省事
-
空间更少
缺点:
-
时间功耗大
-
同分解质因数方法1,特别不稳定
方法2
利用性质:
- \(\sum\limits_{i=1}^{n} d_n = \sum\limits_{i=1}^{n}\) ~ \(n\ln n\)
流程:
- 预处理 \(1\) ~ \(n\) 的每个约数
时间/空间复杂度:\(O(n\log n)\)
适用场景:
- 多组询问
优点:
-
预处理,多组询问不用怕
-
\(1\) ~ \(n\) 批量处理
缺点:
- 如果询问少,数据范围又大,则在绝大部分情况下是不划算的,除非这道题的条件
玄学地卡得你只能用这种方法找约数。
方法3
利用性质:
-
\(n = p_1^{r_1} p_2^{r_2}\dots p_n^{r_n}\)(整数唯一分解定理)
-
\(d | n \Rightarrow d = p_1^{a_1} p_2{a_2} \dots p_k^{a_k} (0 \le a_i \le r_i)\)
流程:
-
分解质因数
-
dfs或者循环枚举指数
-
时间复杂度 \(O(???) + O(d_n)\)
适用范围:
- 较广泛
优点:
- 运用了整数唯一分解定理,
高级,可以同时套一些其他的东西
缺点:
-
复杂度是个玄学问题
-
如果其他的东西不用分解质因数,除非像方法2说的那样给玄学卡死了,用这个方法似乎血亏
找约数
一些算法的复杂度与 \(d_n\) 相关,分析复杂度的时候需要分析:
\(\max\limits_{x=1}^{n} d_x\)
上述式子取得最大值的最小 \(x\) 被称为反素数
Chapter III 线性筛总结
通过线性筛预处理数论函数,需要处理两个基本问题
-
计算在质数处的取值 \(f_p\)
-
由 \(f_i\) 递推得到 \(f_{i\times p}\)
能正确求出数论函数的条件:每种不同的质因子贡献独立
复杂度线性的条件:添加一个质因子时,函数值能够快速递推
-
质数处取值 \(f_p\) 要求 \(O(\log n)\) 内求出(素数定理)
-
由 \(f_i\) 递推得到 \(f_{i\times p}\) 的复杂度必须为 \(O(1)\)
有关同余和欧拉函数
前言
- 集训笔只因
Chapter I 同余
设 $ a = pm + r , b = qm + r $ ,则 $ a $ 同余于 $ b $ ,记作 \(a \equiv b \pmod{m}\)
同余定理:
若 $ a \equiv b $ ,则
-
$ a \pm k \equiv b \pm k \pmod{m} $ 范围:$ k \in N$
-
$ a k \equiv b k \pmod{m} $ 范围:$ k \in N^+$
-
$ a^k \equiv b^k \pmod{m} $ 范围:$ k \in N^+$
-
$ \displaystyle \frac{a}{k} \equiv \displaystyle \frac{b}{k} \pmod{m}$ 范围:$ k \in N^+ $ 且 $ m \(为质数,\) k $的乘法逆元存在时。
-
同余的性质
-
自反性,对称性,传递性
满足自反性,对称性,传递性,三种性质的关系,为等价关系
。
根据等价关系,可以把目标集合划分为若干个等价类
。
剩余类和剩余系
- 对于模数 \(m\) ,利用同余关系(即 \(n=mk+r\) 中的余数 \(r\) ) 可以把整数集合 Z 划分为 \(m\) 个等价类,称作模 \(m\) 的剩余类,记作
每类各取一个代表元构成的集合称为模 \(m\) 的剩余系,一般取
简化剩余系
对模数 \(m\) ,在剩余类 \(Z_m\) 中取出与 \(m\) 互质的数构成的集合,称为模 \(m\) 的简化(既约)剩余系,记作 \(Z_m^*\)
显然 \(Z_m^*| = \varphi_m\),因此 \(Z_m^*\) 有时也叫做 \(\phi_m\)
这里有一个玄学的表达方式:\(\{x |\equiv k\pmod{m},k \in \{1,2,\dots,m-1\}\& (k,m)=1\}\),意思是当 \(k \in \{1,2,\dots,m-1\}\) 且 \((k,m)=1\) 时,有 \(x |\equiv k\pmod{m}\)
- 再探欧拉函数
定义:$\varphi_n $ 为 \(\le n\) 且与 \(n\) 互质的正整数的个数
有必要写出式子了:
欧拉函数的重要玄学性质:
-
欧拉函数是个积性函数:\(\varphi_n = \prod\limits_{i=1}^{k}\varphi(p_i^{r_i})\)
-
其中 \(\varphi_{p^k} = p^k - p^{k-1}\)
-
其他性质还有:
-
\(\varphi_n(n>2)\) 的所有元素之和为 \(\dfrac{n\varphi_n}{2}\)
-
\(n = \sum\limits_{d|n} \varphi_d\)
人类智慧思考题:运用欧拉函数,证明质数有无穷个
Chapter II 模运算
OI中常用的模运算,将运算对象集从整数集(\(Z\))缩减到了模 \(m\) 的剩余系 \(Z_m = {0,1,\dots,m-1}\)
-
将无限转变为有限
-
方便存储,运算,输出,验证
-
通过循环
彰显人类智慧
经典防负数化模运算:
(这里使用了 \%
而非 \mod {}
是为了避免式子又臭又长)
- 加法:
\((a+b)\% m =(a \% m + b \% m) \% m\)
- 减法:
\((a-b)\%m = (a \% m - b \% m + m ) \% m\)
- 乘法:
\(a\times b \% m = (a \% m) \times (b \% m) \% m\)
加减法的取模非常的慢,尽量少在加减中用%
运算。虽然优化比较简单,但是在该用的时候也不可避免。
- 小震不用逃,大震逃不了
所以对于上述相对于乘法而言,可以看淡点(但是还是要重视)。
——而乘法则可能会溢出。\((a \% m) \times (b \% m)\) 也可能会爆掉存储范围。
- 需要一些方法使得在运算乘法的时候不溢出
方法1
快速幂打临时工:仍然快速龟速乘法
利用性质:
- 快速幂模板改造
流程:
- 快速幂模板改造
时间复杂度:\(0(\log n)\)
适用范围:
-
用一些玄学乘法也不行的时候
-
急需数据稳定性
优点:
-
时、空、数据稳定性极强
-
真正意义上的万能模乘
缺点:
-
慢就是慢,时间稳在非常慢的地步。
-
容易敲错模板(ans的初始值为0不是1)
方法2
神秘乘法:
利用性质:
- 一个没有学过的高级知识点——MSK
流程:
int mulmod(int x,int y,int m){
static const int BLEN=20,BMSK=(1<<20)-1;
int yH=y>>BLEN,yL=y&BMSK;
int ret=yH?((x*yH%m)<<BLEN)%m:0;
return (ret+x*yL)%m;
}
- 其中的int可以换成各个类型的变量。
适用范围:
- \(m \le {LONG\_MAX^{\frac{2}{3}}}\)
时间复杂度:\(O(1)\)
优点:
- 复杂度感人(是真的感人!)
缺点:
- \(m > {LONG\_MAX^{\frac{2}{3}}}\) 时仍然寄掉(
虽然龟速乘也会逝世)
方法3
玄学乘法
利用性质:
-
\(LONG_{MAX} = 9223372036854775807\)
-
\(LONG_{MIN} = -9223372036854775808\)
流程:
#define LL long long
LL mulmod(LL x,LL y,LL p){
LL ret=x*y-(LL)((long double) x*y/m + 1e-8)*m;
return ret<0?ret+m:retl
}
-
把数据压入long double中
-
然后
玄学算 -
会溢出,但是溢出只会兜几圈,然后溢出之后的数据刚好等于正确答案
-
只能是long long类型!!!否则溢出的时候就
逝世不好说了
适用范围:
- \(n \le 10^{18},LONG_{MAX}\) 范围内
时间复杂度:同样是真正感人的 \(O(1)\)
优点:
- 适用范围广,不怕数据大,
玄学溢出会给出答案
缺点:
- 只能使用 long long 变量类型
方法4
__int128
优点:
-
同样无脑
-
时间复杂度
居然也是\(O(1)\)
缺点:
-
手写快读快输才能输入输出
-
两个long long的内存,当
#define int __int128
的时候需要注意MLE
事故 -
常数有可能
免费大
乘法讲完了,那么除法呢?
\(b|a\) 时,如何计算 \(\dfrac{a}{b}\mod m\)
\((a\% m)\div (b\% m) \% m\) 肯定是错的(万一不满足消去律的话直接GG)
方法1
人类智慧公式:
啊哈哈哈哈,证明略咯!
适用范围:\(b,m\) 互质与否都行
方法2
在下面:乘法逆元
Chapter III 乘法逆元
如果存在 \(a^{-1}\) 满足 \(a\times a^{-1} \equiv 1\pmod m\),则称 \(a^{-1}\) 为 \(a\) 模 \(m\) 意义下的逆元
有了逆元便能转除法为乘法。
\(\dfrac{a}{b}\mod m = (a\times b^{-1}) \mod m\)
乘法逆元存在条件:\((a,m)=1\)
乘法逆元的常用求法:
-
1 费马-欧拉定理 + 快速幂
- \(a^{-1}\times b \equiv a^{m-2}\times b\pmod{m}\)
-
2 exgcd求逆元
-
3 线性求逆
费马-欧拉定理
(又称欧拉定理)
- 众所周知,费马小定理为
\(a^{p-1}\equiv 1\pmod m\)
用决心提取机提取费马的灵魂,再让欧拉吸收这个灵魂,让他再次发现费马小定理,得到
由这个定理可以得到
- \(a^{-1} = a^{p-2}\)(求逆元方法1的原理)或者 \(a^{-1} = a^{\varphi_m-1}\)
证明费马欧拉定理略。
费马小定理的另外一种形式:\(a^p\equiv a\pmod{p}\)
- 优势是不需要 \(a,p\) 互质,只需要 \(p\) 为质数即可。
Chapter IV 幂塔
当 \(b\ge \varphi_m\) 时
\(a^b \equiv a^{b\mod \varphi_m + \varphi_m}\mod m\)
- 一个更加lip的定理
如果我们设
\(\varphi_{\varphi_{\dots_{\varphi_n}}}\)
(套 \(n\) 个 \(\varphi\) 的恶俗玄学欧拉函数)
为 \({\varphi^k}_p\) ,则 \({\varphi^k}_p\) 为
\(\begin{cases}\varphi_{{\varphi^{k-1}}_p}&k>1\\\varphi_p&k=1\end{cases}\)
则当 \(k\ge 2\log_2 p\) 时,\({\varphi^k}_p = 1\)
有关方程
我又来写博客了哈哈嗨
Chapter I 方程
方程的基本定义:含有未知数的等式
发展路线:
1
-
二元一次方程组 -> 多元一次方程组
-
一元二次方程 -> 一元高次方程
-
多项式方程 -> 超越方程
-
方程的形式越来越复杂
2
特定空间下求解
-
e.g.一元二次方程
-
实数域 \(R\) 内求解 -> 判别式
-
复数域 \(C\) 内求解 -> 必有2根 \(x1,x2\)
不定方程:
在数论背景下,方程的解空间限制一般在整数集 \(Z\) 或者 有理数集 \(Q\)
这种方程称为丢番图方程。
这种方程大多数时候解不唯一,故又称不定方程。
Chapter II 二元一次不定方程
定义:
设 \(a,b,c\) 为非零整数,求关于 \(x,y\) 方程的整数解 \(ax+by=c\)
容易发现,方程左边 \(ax+by\) 必定为 \(d = \gcd(a,b)\) 的倍数。
因此立即得到该方程有整数解的一个必要条件是 \(d | c\)
而充分条件需要使用
如果裴蜀定理成立,则必要条件 \(d | c\) 立即升级为充分必要条件
设有 \(ax_0 + by_0 = \gcd(a,b) = d\),则
\(\begin{cases}x = \dfrac{c}{d} \times x_0 \\ \\ y = \dfrac{c}{d} \times y_0\end{cases}\)
为 \(ax + by = c\) 的一组解
Chapter III 扩展欧几里得算法 exgcd
相当于给了裴蜀定理一个构造性的证明
利用辗转相除法过程中得到的等式 \(r_{k-2} = r_{k-1} q_{k-1} + r_k\)
不断地将较小的 \(r_k\) 表示为 \(r_{k-1}\) 与 \(r_{k-2}\) 的线性组合
设原有 \(d = r_{k-1}x + r_k y\)
带入 \(r_{k-2} = r_{k-1} q{k-1} + r_k\) 得 \(d = r_{k-1}x + (r_{k-2} - r_{k-1} q_{k-1})y\)
整理得递推式 \(\begin{cases}x' = y \\ y' = x - q_{k-1} y\end{cases}\)
用这份代码实现exgcd具有以下特点
-
求解过程中 \(|x| \le |b| , |y| \le |a|\),因此不会溢出,大喜
-
设 \(|a| \ge |b|\),则求出的 \(x\) 满足 绝对值最小,即最小范数解
然后有了exgcd,就可以通过裴蜀定理求 \(ax+by=c\) 的全部解
-
exgcd求 \(ax+by=d\) 的一组解 \(x_0,y_0\)
-
同时乘以 \(\dfrac{c}{d}\) 得到 \(ax+by=c\) 的一组解 \(x_1,y_1\)
-
得到全部解为 \(x = x_1 + \dfrac{b}{d} \times k , y = y_1 - \dfrac{a}{d} \times k\)
Chapter IV 一些方程
- 多元一次不定方程
\(a_1 x_1 + a_2 x_2 + \dots + a_n x_n = b\)
先解决
\(a_1 x_1 + a_2 x_2 = \gcd(a_1,a_2) = g_2\)
所有的 \(g_2\) 的倍数都可以用 \(a_1 x_1 + a_2 x_2\) 表示,反之亦然。
原方程化为 \(g_2 t_2 + a_3 x_3 + \dots a_n x_n = b\)
继续这样,每次将两个式子合并为一个式子,最后得到 \(g_n t_n = b\)
然后解出 \(t_n\) 后再递归回去即可解出全部解。
代码:
#include<bits/stdc++.h>
using namespace std;
long long a[10];
long long n,b;
long long exgcd(long long a,long long b,long long &x,long long &y){
long long d=a;
if(b==0){
x=1;
y=0;
return a;
}else{
d=exgcd(b,a%b,y,x);
y-=a/b*x;
}
return d;
}
long long gcd(long long a,long long b){
return b==0?a:gcd(b,a%b);
}
stack<long long>s;
void getjie(long long a,long long b,long long c,long long &x,long long &y){
long long d=exgcd(a,b,x,y);
x=x*(c/d);
y=y*(c/d);
long long k;
if(x>0){
k=min((x/b),-(y/a));
x-=k*b,y+=k*a;
}
else{
k=min(-(x/b),(y/a));
x+=k*b,y-=k*a;
}
}
long long g[10];
long long t[10];
int main(){
scanf("%lld%lld",&n,&b);
for(long long i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
long long x,y;
long long last=0;
for(long long i=1;i<=n;i++){
if(i==1){
g[i]=a[i];
}else{
g[i]=gcd(g[i-1],a[i]);
}
}
long long xxx;
for(long long i=n;i>=2;i--){
if(i==n){
getjie(g[i-1],a[i],b,x,y);
s.push(y);
}else if(i==2){
xxx=x;
getjie(g[i-1],a[i],g[i]*xxx,x,y);
s.push(y);
s.push(x);
}else{
xxx=x;
getjie(g[i-1],a[i],g[i]*xxx,x,y);
s.push(y);
}
}
while(!s.empty()){
printf("%d ",s.top());
s.pop();
}
return 0;
}
\({\color{red}\colorbox{white}{警告:上述代码只能求得该不定方程的任意一个解}}\)
\({\color{red}\colorbox{white}{输入方式为如下}}\)
n b
a1 a2 a3 … an
因此,该方程有整数解的充分必要条件为
\(\gcd(a_1,a_2,\dots,a_n) | b\)
- 多元不定方程组
高斯消元,暂不讨论。
- 线性同余方程
含有未知数的同余式,且同余式中未知数次数为1,例如 \(ax\equiv b \pmod m\)
注意到同余式的其他等价写法,该同余方程与不定方程 \(ax - my = b\) 等价
因此可以用exgcd求解得 \(x = x_0 + m'k\)
通常也习惯将解也写为同余式 \(x \equiv x_0 \pmod {m'}\)
- 利用exgcd求逆元
解同余方程 \(ax \equiv 1 \pmod m\) 即可得到 \(a\mod m\) 的乘法逆元。
相比于费马小定理+矩阵快速幂的方法,优势是不要求 \(m\) 是质数
int getinv(int a,int m){
int x,y;
int d=exgcd(a,m,x,y);
if(d!=1)//不互质
return -1;//当场逝世
else
return (x%m+m)%m;//求解得到的x,mod一下
}
- 多元线性同余方程
\(a_1 x_1 + a_2 x_2 \dots + a_x x_n \equiv 1 \pmod m\)
解法和多元一次不定方程差不多。
- 线性同余方程组
求解 \(\begin{cases}x \equiv 2 \pmod 3 \\ x \equiv 3 \pmod 5 \\ x \equiv 2 \pmod 7\end{cases}\)
答案: \(x = 2 \times 70 + 3 \times 21 + 2 \times 15 = 233 \times 23 \pmod 105\)
70为5和7的倍数且%3同余1
21为3和7的倍数且%5同余1
15为3和5的倍数且%7同余1
因此易验得 \(2\times 70 + 3\times 21 + 2\times 15\) 同时满足三个同余式。
下面则是这个问题的结论:
Chapter IV 中国剩余定理
China RecudeChinese Remainder Theorem,简称CRT
设 \(m_1,m_2,\dots ,m_n\) 两两互质,则关于 \(x\) 的线性同余方程组 \(\begin{cases}x\equiv b_1 \pmod {m_1} \\ x\equiv b_2 \pmod {m_2} \\ \dots\dots\dots\dots \\ x \equiv b_n \pmod {m_n}\end{cases}\) 对于任意正整数序列 \(b_1,b_2,\dots,b_n\) 均有正整数解且解集为 \(x\equiv x_0 \pmod {m_1,m_2,\dots ,m_n}\)
记作 $m = \prod\limits_{i=1}^{n} m_i $ , 且 $ M_i = \dfrac{m}{m_i}$
-
解 \(u_i\times M_i \equiv 1 \pmod m_i\) 得到关键参数 \(e_i = u_i \times M_i\)
-
计算出解为 \(x\ \equiv e_1 b_1 + e_2 b_2 + \dots + e_n b_n \pmod m\)
中国剩余定理的本质为 \(\begin{cases}x \equiv 23 \pmod 3 \\ x \equiv 23 \pmod 5 \\ x \equiv 23 \pmod 7\end{cases} \Leftrightarrow x \equiv 23 \pmod {105}\)
既可以正向应用解方程,也可以逆向应用分解问题。也就是说,中国剩余定理存在逆定理
中国剩余定理及其构造性的解法要求模数两两互质
不互质时,可以逆用中国剩余定理,将其拆分为多个模 \(p^s\) 的方程,对于相同的 \(p\) 可以都合并为同一个方程,或者矛盾导致无解
e.g.
\(\begin{cases}x \equiv 7 \pmod {12} \\ x \equiv 1 \pmod {10} \end{cases} \Leftrightarrow\begin{cases}x \equiv 1 \pmod 3 \\ x \equiv 3 \pmod 4 \\ x \equiv 1 \pmod 2 \\ x \equiv 1 \pmod 5\end{cases} \Leftrightarrow \begin{cases}x \equiv 1 \pmod 3 \\ x \equiv 3 \pmod 4 \\ x \equiv 1 \pmod 5\end{cases}\)
这个方法实在太麻烦了,所以我们让CRT学习gcd同志,让他稍微ex一下,变成
exCRT 拓展/扩展中国剩余定理
将同余式 \(\begin{cases}x \equiv b_1 \pmod {m_1} \\ x \equiv b_2 \pmod {m_2}\end{cases}\) 改写成等式 \(\begin{cases}x = b_1 + m_1 k_1 \\ x = b_2 + m_2 k_2\end{cases}\),则 \(m_1 k_1 - m_2 k_2 = b_2 - b_1\)
\(m_1 k_1 - m_2 k_2 = b_2 - b_1\)
是关于 \(k_1\) 和 \(k_2\) 的不定方程,有解的充要条件是 \(\gcd(m1,m2) \quad\!\!\! | \quad\!\!\!(b2-b1)\)
解除 \(k_1 = k_1' + \dfrac{m_2}{\gcd(m_1,m_2)}\times t\) 后代入得
\(x = b_1 + m_1 k_1 = b_1 + m_1 k_1' + \dfrac{m_1 m_2}{\gcd(m_1,m_2)}\times t\)
注意到 \(\dfrac{m_1 m_2}{\gcd(m_1,m_2)}\) 为 \([m_1,m_2]\),也就是 \(lcm(m_1,m_2)\)
再次将解改为同余式
\(x \equiv b_1 + m_1 k_1' \pmod{[m_1,m_2]}\)
这样,我们做一次exgcd就可以把两个同余方程合并为一个
此外,拓展中国剩余定理分三种数据范围
-
\([m_1,m_2,m_3 \dots m_n] \le 10^{18}\)
-
保证有解,且解不超过 \(10^{18}\)
-
不保证有解,但有解的时候解不超过 \(10^{18}\)
Chapter V 高次方程
各种方程。
高次同余方程
\(x^n \equiv a \pmod m\)
如果 \(m\) 存在原根,设\(x = g^{x'},a=g^{a'}\) 则问题转换为 \(g^{x'n} \equiv g^{a'} \pmod m\)
也就是 \(x'n \equiv a\ \pmod {\varphi_m}\)
上述方程有解的条件显然为 \(\gcd(n, \varphi_m) | a'\)
且有解时解的数量为 \(\gcd(n,\varphi_m)\)
如果 \(x^n \equiv a \pmod m\) 中,\(m\) 不存在原根,设 \(m = p_1^{r_1} \times p_2^{r_2} \times \dots \times p_n^{r_n}\) ,用中国剩余定理拆分为 \(n\) 个方程,除了 \(2^s\) 外都有原根,则可以按照上述方法求解。
而$ \mod 2^s$ 也有专门的求解方法。这里不再深究。
高次不定方程
<= 这几把就是个没通用解法的东西 =>
不再深究。
Chapter VI 方程的应用
应用
勾股数
不定方程 \(x^2 + y^2 = z^2\) 的一组整数解,\(x,y,z\) 成为一组勾股数。
当 \(\gcd(x,y,z) = 1\) 时,\(x,y,z\) 称作本原勾股数或 \(x^2 + y^2 = z^2\) 的本原解。
所有本原解可以唯一表示为 \(\begin{cases}x = m^2 - n^2 \\ y = 2mn \\ z = m^2+n^2 \end{cases}\) 其中 \(m>n\) 且 \(m,n\) 互质,还必定一奇一偶。
二平方和问题
解不定方程 \(x^2 + y^2 = C\)
当 \(C = 4\times k + 1 (k \in N^*)\) 且为质数时,该方程有唯一解(不考虑顺序与正负)
四平方和问题
解不定方程 \(a^2 + b^2 + c^2 + d^2 = n (n > 0)\)
这个东西看似结果应该很复杂,实际上很简洁:必定有正整数解
任意正整数可以分解为4个整数的平方之和
高斯整数和高斯质数
涉及虚数,不再深究
费马大定理
注意是大定理不是小定理
关于 \(x,y,z\) 的不定方程 \(x^n + y^n = z^n (n\ge 3)\) 无解
各位可以去尝试感性证明一下,提示:勾股定理
至于理性证明,各位可以长逝。
关于组合
近期学习了什么?
-
组合数
- 基本排列数
- 基本组合数
- Lucas & Ex! Lucas
万恶的组合恒等式- 可重集排列
- 可重集组合
- 圆排列
- 错位排列
-
抽屉原理
-
Ramsey(拉姆齐)数
以下是肝货
排列组合数基本定义
\(\displaystyle A_n^m = \frac{n!}{(n-m)!}\)
\(\displaystyle C_n^m = \frac{n!}{(n-m)!\,m!}\)
基本性质
\(C_n^0 = C_n^n = 1\)
\(C_n^m = C_n^{n-m}\)
杨辉三角
\(C_n^m = C_{n-1}^{m-1} + C_{n-1}^{m}\) (杨辉三角递推式,也是组合数的一个基本性质)
1
1 2 1
1 3 3 1
1 4 6 4 1
………
二项式定理 \((a+b)^n = \displaystyle \sum\limits_{k=0}^{n}C_n^k a^k b^{n-k}\)
单行之和公式:\(\displaystyle \sum\limits_{k=0}^{n}C_n^k = 2^n\)
拓展:\(\displaystyle \sum\limits_{k=0}^{n}m^k C_n^k = (m+1)^n\)
容斥原理的另外一种形式:\(\displaystyle \sum\limits_{k=0}^{n}(-1)^k C_n^k = 0\)
杨辉三角奇数项之和等于偶数项之和: $ C_n0+C_n2+\dots = C_n1+C_n3+\dots = 2^{n-1}$
组合恒等式
\(\displaystyle \sum\limits_{k=0}^{n}k C_n^k = n 2^{n-1}\)
\(\displaystyle \sum\limits_{k=0}^{n}k^2 C_n^k = n(n+1)2^{n-2}\)
\(\displaystyle \sum\limits_{k=0}^{n} C_k^m = C_{n+1}^{m+1}\)
\(\displaystyle \sum\limits_{k=0}^{n} C_n^k C_m^{r-k} = C_{n+m}^{r}\)
\(C_n^k C_k^r = C_n^r C_{n-r}^{k-r}\)
可重集排列
可重集中有 \(m\) 类物品,数量无限,每样物品至少选一件,从中选出 \(n\) 件物品,有多少种方案?
-
隔板法,问题等价于:
-
\(n\) 个物品排成一列,在 \(n-1\) 个空位中插入 \(m-1\) 个挡板,(即分为了 \(m\) 类)。方案数为:
\(C_{n-1}^{m-1}\)
可重集中有 \(m\) 类物品,数量无限,每样物品允许不选择,从中选出 \(n\) 件物品,有多少种方案?
-
先给每个物品预分配一件
-
问题转换为“选出 \(n+m\) 个物品”,方案数为:
\(C_{n+m-1}^{m-1}\) 或 \(C_{n+m-1}^{n}\)
可重集中有 \(m\) 类物品,每类数量为 \(a_i\) ,从中选出 \(n\) 件物品,有多少种方案?
-
考虑第\(i\)类物品超过限制的方案,此时其他物品不受限制,即当成无限来看。
-
一件物品都违规了,还分开算其他物品是否超限干嘛?
-
此时至少要先分配 \(a_i+1\) 件,剩余部分亦可当成无限看待,即问题转化为 \(n-a_i-1\)时的无约束问题。
可重集中有 \(m\) 类物品,每类数量为 \(a_i\) ,从中选出 \(n\) 件物品,求全排列数量。
- 除法原理直接得到
\(\displaystyle \frac{n!}{\prod_{i=1}^{m}a_i!}\)
也可以通过组合数达到:
\(C_n^{a_1} C_{n-a_1}^{a_2}\dots C_{n-a_1-a_2-\dots a_{m-1}}^{a_m}\)
圆排列:
\(n\) 个物品排成一个环,在考虑循环同构的情况下有多少种方案
\((n-1)!\)
错位排列
\(n\) 个元素构成的序列中,第 \(i\) 号元素不在第 \(i\) 个位置的方案数。
容斥原理枚举恰好在自己的位置的元素数量 \(k\)
\(\displaystyle D_n = \sum\limits_{k=0}^n (-1)^k C_n^k (n-k)! = n!\sum\limits_{k=0}^n \frac{(-1)^k}{k!}\)
二阶递推式:
\(D_n = (n-1)(D_{n-1}+D_{n-2})\)
\(D_{n-2}\) 为放位置 \(n\)
\(D_{n-1}\) 为不放位置 \(n\)
一阶递推式:
\(D_n = n D_{n-1}+(-1)^n\)
抽屉原理
把 \(n+1\) 个苹果放入 \(n\) 个抽屉,至少有 \(1\) 个抽屉内放有不少于 \(2\) 个苹果
-
但凡之前学过数学,狗都会记得这个东西
-
这里不讲了
Ramsey 数
6个点的完全图:用两种颜色染边后,一定存在纯色三角形。
人话:6个人里一定有3个人互相认识或者互相不认识。
- Ramsey数:
至少多少人可以保证其中一定存在\(n\)个人互相认识或存在\(m\)个人互相不认识,记作\(R(n,m)\)
e.g. \(R(3,3) = 6\)
-
Ramsey数非常难算!!!
-
算出Ramsey(12+,12+),北大
疯人院院长资深数学教授都佩服你
Lucas定理
有关矩阵
这篇田博文主要研究什么捏?
-
向量作者一已经弃坑该子栏目 -
矩阵 (要细谈)
Chapter Former 代数框架
先阐明线性代数的范围:
算术:
\(\displaystyle 1+2\quad 1-2\quad 1\times 2\quad 1\div 2\quad 1^2\quad \frac{1}{2}\)
代数:
\(\displaystyle a+b\quad a-b\quad a\times b\quad a\div b\quad a^b\quad \frac{a}{b}(b\neq0)\)
-
线性代数:多元一次方程组 今日研究
-
多项式代数:一元高次方程组
Chapter I 向量
tmd不写了。
Chapter II 矩阵
- \(n\) 行 \(m\) 列构成的数字表。
一般用大写字母表示矩阵,记 \(A \in R^{n\times m}\)
例如,\(A \in R^{n\times m}\) 是一个 \(2 \times 2\) 的实矩阵
则有可能 \(A=\begin{pmatrix}1\quad1\\1\quad1\end{pmatrix}\)
矩阵允许有重复的元素。
\(A=\begin{pmatrix}a_{11}\dots a_{1m}\\\vdots \;\;\;\ddots\;\;\;\ \vdots \\a_{n1}\dots a _{nm}\end{pmatrix}\)
对于 \(A=\begin{pmatrix}1\quad1\\1\quad1\end{pmatrix}\),第 \(i\) 行 \(j\) 列的元素可以记作 \(a_{ij}\) 或 \(A_{ij}\)
- 矩阵加减法
相同行列的矩阵才能加减。
运算法则很简单:对应位置的元素相加减。
e.g.
\(\begin{pmatrix}1\quad1\\4\quad5\end{pmatrix} + \begin{pmatrix}1\quad9\\1\quad8\end{pmatrix} =\begin{pmatrix}2\quad10\\5\quad13\end{pmatrix}\)
- 矩阵数乘
一个矩阵和一个数相乘。
矩阵的每个元素分别乘上这个数。
e.g.
\(\begin{pmatrix}1\quad1\\4\quad5\end{pmatrix} \times 6 = \begin{pmatrix}6\quad6\\24\quad30\end{pmatrix}\)
- 矩阵乘法
设 \(A \in R^{n\times m} , B \in R^{m\times p}\),则 \(C = AB \in R^{n\times p}\) ,且 \(C_{ij}\sum\limits_{r=1}^{m}A_{ir}B_{rj}\)
左矩阵A的列数要等于右矩阵B的行数才能相乘。
且结果矩阵C中,第 \(i\) 行 \(j\) 列元素的计算方式为:
取出左矩阵A中第 \(i\) 行与右矩阵B中第 \(j\) 列,对应项相乘再相加
e.g.
\(\begin{pmatrix}\;\;\ 1\quad0\quad2\\-1\quad3\quad1\end{pmatrix} \times \begin{pmatrix}3\quad1\\2\quad1\\1\quad0\end{pmatrix}=\begin{pmatrix}5\quad1\\4\quad2\end{pmatrix}\)
矩阵乘法大部分情况不满足交换律,但满足结合律与加法(乘法)分配律。
\(\mathtt{(AB)C=A(BC)}\)
\(\mathtt{(A+B)C=AC+BC}\)
\(\mathtt{C(A+B)=CA+CB}\)
- 矩阵数除法:
同矩阵数字乘,直接乘以倒数即可。
至于除零我不管
- 矩阵除法:
需要用到矩阵逆元,暂时不谈。
- 矩阵转置:
互换行列。
转置矩阵:一个矩阵转置后得到的另外一个矩阵。
记 \(A\) 的转置矩阵为 \(A^T\)
\(\begin{pmatrix}1\quad 1\\4\quad 5\end{pmatrix}^T = \begin{pmatrix}1\quad 4\\1\quad 5\end{pmatrix}\)
根据定理不难得到一条臭名昭著的性质:
\((A+B)^T = A^T + B^T\)
而通过人类智慧想象可以想出下面这个性质:
\(A^T B^T = (AB)^T\)
特殊矩阵:
- 零矩阵
元素全部为0的矩阵
一般就记作 \(0\) 或 \(0^{n\times m}\)
显然有
\(A + 0 = A\)
\(A^{n\times m} \times 0^{m\times k} = 0^{n\times k}\)
- 方阵:
行数等于列数的矩阵。
由于行数等于列数,方阵相乘无需担心行列匹配的问题。
故,多次乘一个方阵可以写成幂的形式。
(矩阵快速幂)
注意:
写代码运行矩阵快速幂时,如果使用大矩阵结构体传参,可能会莫名其妙地RE
原因:
\(\boxed{\mathsf{ Stack\;overflow\; is\; a\; part\; of\; OI.\quad Don't \;play \;if \;you're \;upset.}}\)
栈溢出是OI的一环,不爽不要玩。
- 单位阵:
主对角线元素为1,其他元素全为0的 \(n\) 阶方阵。
单位阵记作 \(E\) 或 \(I_n\),其中\(n\) 就是上面的那个 \(n\)。
单位阵在矩阵乘法中的地位相当于1在数字乘法之中的地位。
设 \(A \in R^{n\times m}\) 则有\(AI_m = A\),\(I_nA = A\)
常见的矩阵快速幂的初始化写法有两类。
一类是初始化为单位阵。
另一类是直接初始化为作为底数的矩阵,然后直接少乘一次指数即可。
当然,大部分情况下lty2000狗都会选择第二种,但第一种确乎是万能的。
虽然我也不知道什么情况第二种写法会被卡掉
- 对角阵
除了主对角线之外的元素全部为 \(0\) 的方阵。
可以记作 \(jiag(a_{11},a_{22},\dots a_{nn})\)
单位阵属于对角阵。
左乘对角阵相当于把第 \(i\) 行的元素全部乘以 \(a_{ii}\)
右乘对角阵相当于把第 \(i\) 列的元素全部乘以 \(a_{ii}\)
- 三角阵
主对角线以下的元素全部为 \(0\) 的方阵为上三角阵。
主对角线以上的元素全部为 \(0\) 的方阵为下三角阵。
e.g.
\(\begin{pmatrix}1\quad 1\\0\quad 5\end{pmatrix}\) 为上三角阵。
\(\begin{pmatrix}1\quad 0\\4\quad 5\end{pmatrix}\) 为下三角阵。
对角阵既是上三角阵也是下三角阵。
上三角阵乘上三角阵还是上三角阵。
下三角阵乘下三角阵还是下三角阵。
- 对称阵
满足 \(A^T = A\) 的方阵,即满足 \(a_{ij} = a_{ji}\)
设 \(A \in R^{n\times m}\),则\(AA^T\) 和 \(A^TA\)都是对称阵。