简单数学
数论
常见概念和符号
整除/同余常见符号
整除符号 x∣y,表示 x 整除 y ,即 x 是 y 的因数
取模符号 xmod ,表示 x 除以 y 以后的余数
互质符号 x~\bot~y ,表示 x ,y 互质
最大公约数 \gcd(x,y)
最小公倍数 \text{lcm} (x,y)
数论函数常见符号
求和符号:\sum 符号,表示满足特定条件的数的和
\sum _{i=1} ^{n} ai 表示 a_1\sim a_n 的和
\sum_{S\subseteq T} |S|
求积符号:\Pi 符号,表示满足特定条件的数的积
- \Pi_{i=1}^n 表示 n!
- \Pi _{i=1}^{n} a_i 表示从 a_1\sim a_n 的积
- \Pi _{x\mid d} x 表示 d 的所有因数的乘积
整除符号:\mid ,a \mid b 表示 a 是 b 的约数 b 不被 a 整除记作 a \nmid b 。
同余符号:\equiv ,a\equiv b \pmod c 表示 \dfrac a c -\lfloor \dfrac a c \rfloor=\dfrac b c-\lfloor \dfrac b c \rfloor 或者说 a/c 和 b/c 的余数相同
数论函数
数论函数指定义域为正整数的函数。数论函数也可以视作一个数列。
积性函数
若 f(n) 表示 f(1)=1 且 \forall x,y \in N_+ \gcd(x,y)=1 都有 f(xy)=f(x)f(y),则 f(n) 为积性函数
若 f(n) 表示 f(1)=1 且 \forall x,y \in N_+ 都有 f(xy)=f(x)f(y),则 f(n) 为完全积性函数
导数公式
(C)^{‘}=0 (x^\mu)’=\mu x^{\mu-1}
(a^x)’=a^x\ln x ( a 为常数) (\sin x)’=\cos x
(\cos x)’=-\sin x (\tan x)’=\sec^2x
(\cot x)’=-\csc^2x (\sec x)’=\sec x \cot x
(\csc x)’=-\csc x\cot x (\ln x)’=\dfrac{1}{x}
({\log_a}^x)’=\dfrac{1}{x\ln a} (e^x)’=e^x
加减公式:
(u\pm v)’=u’\pm v’ (Cu)’=Cu’ (C是常数)
(uv)’=u’v+uv’ (\dfrac{u}{v})’=(\dfrac{u’v-uv’}{v^2})
复数
设a,b为实数,i^2=-1,形如a+bi的数叫复数,其中i被称为虚数单位,复数域是目前已知最大的域
在复平面中,x 代表实数,y 轴(除原点外的点)代表虚数,从原点(0,0)到(a,b)的向量表示复数a+bi
模长:从原点(0,0)到点(a,b)的距离,即\sqrt{a^2+b^2}
幅角:假设以逆时针为正方向,从xx轴正半轴到已知向量的转角的有向角叫做幅角
计算:平行四边形法则(其实就是分配律),注意这里的i^2为-1:
几何定义:复数相乘,模长相乘,幅角相加(至今我也没看懂)
(a+bi)\times (c+di)=ac+bdi^2+bci+adi=ac-bd+(bc+ad)i
同时,我们由向量的知识迁移到复数上来,定义 复数的模 就是复数所对应的向量的模。
复数 z=a+bi 的模 |z|=\sqrt{a^2+b^2}
于是为了方便,我们常把复数 z=a+bi 称为点 Z
由向量的知识我们发现,虚数不可以比较大小
复数满足交换律,结合律,对加法的分配律
当两个虚数实部相等,虚部互为相反数时,这两个复数互为 共轭复数。
即 z=a+bi 的共轭复数为 z=a-bi
位运算
一般均是在二进制下来说
基本运算
1.与 (&) 两个对应位都为 1 时才为 1
2.或 (|) 只要两个对应位中有一个 1 时就为 1
3.异或(^) 只有两个对应位不同时才为 1
取反(~)
把0变成1,把1变成0
补码:在二进制表示下,正数和 的补码为其本身,负数的补码是将其对应正数按位取反后加一。
应用:\text{lowbit}(x)=(x)\&(-x) 取出最后一个等于1的位数,具体原因想一想
左移和右移
num<<i
表示将 num 的二进制表示向左移动1位所得的值。
num>>i
表示将 num 的二进制表示向右移动1位所得的值。
注意:+
和-
的优先级高于左移右移
高精度
1 |
|
数论
整除性质
同余性质
最大公约数与最小公倍数
若干个数所有约数中的共同的最大数是最大公约数,倍数中共同的最小数是最小公倍数
一般两个数的最大公约数是 \gcd 最小公倍数是 \mathrm{lcm}
$\gcd(a,b)\mathrm{lcm}(a,b)=ab$
求法:辗转相除
1 | int gcd(int a,int b){return a%b==0?a:gcd(b,a%b);} |
整除分块
整除分块是用于快速处理形似
的式子的办法
引理1
证明略
引理2
对于一个较大的 n 我们显然会发现,我们后面的这个下取整取值并不是每一次都随着 i 而变化的,它是呈块状分布的,同时这个下取整的值我们也能得到,应该是共有 2\sqrt n 个值
结论:
通过严谨的数学推理(打表) 我们发现实际上这些取值是有规律的,即
如果一个块的开始位置时 l 那么它的结束位置 r 就是 \lfloor \dfrac n {\lfloor \frac n l \rfloor} \rfloor
那么我们写程序的基本结构就很显然了
1 | for(int l=1,r;l<=n;l=r+1) r=n/(n/l); |
所以我们对于形如:
可以对 f(i) 可以直接前缀和预处理,就可以解决这道问题了
欧拉函数
φ(n) :定义:1~n中与n互质的数的个数
公式:
莫比乌斯函数
我们一般表示为 \mu(x)
- \exists d_i\ge 2,\mu(x)=0
- \forall d_i=1,\mu(x)=(-1)^k (k 是质因数分解后有几项)
- x=1 ,\mu(x)=1
如:
\mu(6)=1 \mu(7)=-1 \mu(8)=0
设 s(n)=\sum_{i=d\mid n}^{n} \mu (i)
如 s(6) = \mu(1) +\mu(2) +\mu(3) +\mu(6)
那么:
- 当 n=1,s(n)=1
- 当 n>1,s(n)=0
对于2
的证明:
首先我们对于 n 因式分解:n=p_1^{\alpha_1}\times p_2^{\alpha_2}\times\dots\times p_k^{\alpha_k} (k\ge 1)
那么我们的每一个 d 都有:d=p_1^{\beta_1}\times p_2^{\beta_2}\times\dots\times p_k^{\beta_k} (\forall i \in [1,k] 0\le\beta_i\le \alpha_i)
那么我们算一下 \mu(d) 可知,我们只需要考虑,如果\exists i \in [1,k],\beta_i\ge 2 则原式为0
所以我们只需要看里面有多少个1即可
所以我们用组合数算一下:
我们这时候看一下二项式定理:
钦定 a=1 b=-1
所以 \mu(x) 必然等于=0,得证
各种筛法
埃氏筛
用于统计从1-n中的质数
原理
:从前往后筛,如果筛到一个数i,然后把i的倍数都删了
时间复杂度:O(nlog^2n) 基本可以跑到3e5
1 | void statistics(int n){ |
线性筛
这个东西很重要,关系到后面的积性函数求解
先放一个代码:
1 | void primes(int n){ |
我们观察和上面那个的区别
发现无非就是多了一行if(i%prime[j]==0) break;
我们先给个证明来说明这句话加上后的正确性
证明
当i是prime[j]的整数倍时\iff prime[j]\mid i
设 k=i/prime[j]
则 $iprime[j+1]=prime[j](prime[j+1]*k)$
所以说 i*prime[j] 是 prime[j] 的整数倍
不需要继续标记
对于 prime[j+2]*i 等同理,所以说可以直接跳出循环,不需要重新标记
这样线性筛的复杂度就可以被优化到 O(n) 了
欧拉筛
我们可以把这件求phi分成两步
k是质数
首先我们容易发现一个问题:如果k是质数,那么\varphi (k)显然等于k-1,因为小于k的数都与k互质
所以我们可以把这一句:if(!vis[i]) p[++num]=i;
再加上一句phi[i]=i-1;
i\%p=0 时
然后我们需要证明一个东西:
若p\mid i且p为质数 则 $\varphi(ip)=p\varphi(i)$
证明:
若p \mid i 则可以推出p 是 i 的一个质因子
我们发现:一个数的欧拉函数与每一项的次数无关
所以说
同时
发现两个式子除了 i*p 全部相同
所以我们可以推出 $\varphi(ip)=p\varphi(i)$
证毕
那么很显然在这一句中
if(i%prime[j]==0) break;
我们可以加上phi[prime[j]*i]=prime[j]*phi[i]
i\%p!=0 时
p 一定是 i*p_j 的最小质因子
先把 \varphi(i) 的式子摆在这
然后
我们把下面的式子除以上面的式子发现:
把 \varphi(i) 挪到右边最后可以得到
所以我们讨论完了所有的情况,可以得到最终式子:
1 | inline void get_euler(int n){ |
莫比乌斯筛
这个比较简单,就不写了
1 | inline void get_euler(int n){ |
分解质因数
试除法
用于单个数检验是否为质数
原理
:从1枚举到\sqrt n观察是否有数能被n整除
1 | void prime(int x){ |
Miller-Rabin
用法:O(k\log^2n) 判断 n 是否是质数。其中 k 是枚举底数的个数,2^{78} 以内只需要枚举 12 个。
费马小定理:
若 p 是质数且 p \nmid a
我们可以根据费马小定理
得出一种检验素数的思路(Fermat 素性测试
):
它的基本思想是不断地选取在 [2,n) 中的 a,并检验是否每次都有 a^{n−1}\equiv 1 \pmod n
但是很遗憾,费马小定理的逆定理并不成立
卡迈克尔数:如果有一个合数 n 满足任何一个 a 都满足 a^{n−1}\equiv 1 \pmod n,那么我们称这个合数 n 为卡迈克尔数,同时,满足 m=2^n-1 那么 m 还是卡迈克尔数,所以卡迈克尔数是无穷的
二次探测定理:
若 p 是奇素数,则 x^2 \equiv 1 \pmod p 的解为 x=1 或 x=p-1 \pmod p
算法流程:
(1)对于偶数和 0,1,2 可以直接判断。
(2)设要测试的数为 x,我们取一个较小的质数 a,设 s,t,满足2^s\times t=x-1 (其中 t 是奇数)。
(3)我们先算出 a^t,然后不断地平方并且进行二次探测(进行 s 次)。
(4)最后我们根据费马小定律,如果最后 a^{x-1}\not\equiv 1 \pmod x,则说明 x 为合数。
(5)多次取不同的 a 进行 Miller-Rabin 素数测试,这样可以使正确性更高
备注:
(1)我们可以多选择几个 a,如果全部通过,那么 x 大概率是质数。
(2)Miller-Rabin 素数测试中,“大概率”意味着概率非常大,基本上可以放心使用。
(3)当 a 取前12个素数时,可以证明 2^{78} 范围内的数不会出错。
(5)另外,如果是求一个 \text{long long} 类型的平方,可能会爆掉,因此有时我们要用快速乘,不能直接乘。
\text{Pollard-Rho} 先咕了
裴蜀定理
对于二元一次方程 ax+by=c,有整数解的充要条件是 \gcd(a,b) \mid c。
推论:当 ax+by=1 时,当且仅当 \gcd(a,b)=1 时有解。
证明:
设 d=\gcd(a,b) 则 d \mid a,d\mid b。由整除的性质 \forall x,y\in Z,有 d \mid (ax+by)。
设 s 为 ax+by 最小正值,令 q=\left\lfloor \dfrac{a}{s} \right\rfloor。
则 r=a\pmod s=a-q(ax+by)=a(1-qx)+b(-qy)。
可见 r 也为的线性组合。
由于 r 为 a\pmod s 所得,所以 0\leq r<s。
由于 s 为线性组合的最小正值,可知。
因此有 s\mid a ,同理 s\mid b ,因此,s 是 a 与 b 的公约数,所以 d\ge s。
因为 d\mid a ,d\mid b ,且 s 是 a 与 b 的一个线性组合,所以由整除性质知 d\mid s。
但由于 d\mid s 和 s>0,因此 d\le s。
由 1,2 得 d=s ,命题得证。
exgcd
现在我们对于 ax+by=c 想要获得一组整数解。
首先 c 肯定是要满足 \gcd(a,b) \mid c 的(要不然裴蜀定理白证明了)。
然后我们可以直接求 a_1x+b_1y=\gcd(a_1,b_1) 的一组整数解,最后 x,y 再乘上 c/\gcd(a_1,b_1) 即可
好了,我们现在说怎么求解。
当 b=0 时,显然 x=1,y=0
当 b\not= 0 时,有:
ax+by=\gcd(a,b)
\because\gcd(b,a\bmod b)=\gcd(a,b)
\therefore a x + b y = \gcd ( a , b ) = \gcd ( b , a \bmod b ) = b \times t x + ( a \bmod b ) \times t y
\because a \bmod b=a- \left\lfloor \dfrac{a}{b} \right\rfloor\times b
\therefore a x+b y=b\times tx+(a- \left\lfloor \dfrac{a}{b} \right\rfloor\times b)\times ty=a\times ty+b\times(tx−\left\lfloor \dfrac{a}{b} \right\rfloor\times ty)
\therefore x=ty,y=tx-\left\lfloor \dfrac{a}{b} \right\rfloor\times ty
此时我们容易发现: x 和 y 都被转化成了两个更小的数,然后递归求解即可
1 |
欧拉定理
证明:
设 x_1,x_2,\dots,x_{\varphi(m)} 是 [1,m] 里面与 m 互质的数,由于在 \bmod m 意义下两两不同且余数都与 m 互质
因此我们推理:ax_i 必定也是 \bmod m 意义下两两不同且余数都与 m 互质的数
所以:
拓展欧拉定理
推理:Oi Wiki)
乘法逆元
定义:若 ax\equiv 1\pmod b 且 a 与 b 互质,那么我们就能定义 x 为 a 的逆元,记为 a^{-1} ,所以我们也能称 x 为 a 在 \pmod b 意义下的倒数,此时我们对于 \dfrac{a}{b}~\pmod p,我们就可以求出 b 在 \pmod p 意义下的逆元,来代替 \dfrac{1}{b}
快速幂
由费马小定理:若 p 为素数,a 为正整数,且 a 、p 互质。则有 a^{p-1}\equiv 1\pmod p
所以
所以我们用快速幂算出来 a\times b^{p-2} 就有 \dfrac{a}{b} 的逆元的值了
1 |
拓展欧几里得
求解 ax\equiv c \pmod b 中 c=1 的情况。我们可以转化为求解 ax+by=1 的解
所以:
1 | ll exgcd(ll a,ll b,ll &x,ll &y){ if(!b){ x=1;y=0; return a; } else{ ll tx,ty; ll d=exgcd(b,a%b,tx,ty); x=ty;y=tx-(a/b)*ty; return d; }}int a,p,x,y;int main(){ scanf("%d%d",&a,&p); int d=exgcd(a,p,x,y); x=(x%p+p)%p;} |
线性求逆元
首先,我们设 p=kx+r
那么我们很容易发现:kx+r\equiv 0\pmod p
此时,我们左右同时乘上 k^{-1}r^{-1} 可得
kr^{-1}+x^{-1}\equiv 0\pmod p
\therefore x^{-1}\equiv -kr^{-1}\pmod p
把 k=\left\lfloor \dfrac{p}{x} \right\rfloor r=p \bmod x 代入,得
x^{-1}\equiv -\left\lfloor \dfrac{p}{x} \right\rfloor \times (p \bmod i)^{-1} \pmod p
阶乘求逆元
首先,有如下的一个关系:
inv_{i+1}=\dfrac{1}{(i+1)!}
inv_{i+1}*(i+1)=\dfrac{1}{i!}\times \dfrac{1}{n+1}\times (n+1)=\dfrac{1}{i!}=inv_i^{-1}
所以我们可以先求出 n 的逆元,然后逆推即可
同时,我们也可以发现 \dfrac{1}{i} 的逆元就是:\dfrac{1}{i!}\times (i-1)!=\dfrac{1}{n}\pmod p
Lucas
定理:
中国剩余定理(CRT)
定理:对于下列一些式子的整数求出符合条件的最小的正整数 x
首先,若(m_1,m_2\dots m_n)两两互质
我们即可直接令 M=m_1\times m_2\dots\times m_n
则令 M_i=\dfrac{M}{m_i}
当 x 满足 x = x_1\times M_1\times M_1^{-1}+x_2\times M_2\times M_2^{-1}\dots 时
一定符合上面的式子
莫比乌斯反演
形式一:
证明:
我们容易发现:对于右边的式子 \sum_{i\mid x}g(i) \sum_{d\mid \frac x i} \mu(d)
结合莫比乌斯函数刚才推的性质2
,我们很容易得到该式 =f(x)
得证
形式二: