更简单的就不说了。
a. 逆元#
定义a.1:满足 ax≡1(modp) 的 x 称为 a 的逆元
推论a.1.1:当满足 gcd(a,p)=1 时,逆元存在。
可用费马小定理或 exgcd 求解。
b. 积性函数#
定义b.1:在数论中,若函数 f(n) 满足 f(1)=1,且 f(xy)=f(x)f(y) 对任意互质的 x,y∈N∗ 都成立,则 f(n) 为 积性函数。
定义b.2:在数论中,若函数 f(n) 满足 f(1)=1 且 f(xy)=f(x)f(y) 对任意的 x,y∈N∗ 都成立,则 f(n) 为 完全积性函数。
-
常见积性函数:φ,μ。
-
完全积性函数:id(id(n)=n),I(I(n)=1),ϵ(ϵ(n)=[n=1])。
b.1. 性质#
-
性质b.1.1:若 f(x) 为积性函数,那么 f(xp),fp(x) 也为积性函数。
-
性质b.1.2:若 f(x),g(x) 为积性函数,那么 f(x)g(x),h(x)=∑d∣xf(x)g(dx) 也为积性函数。
c. 迪利克雷卷积#
定义c.1:(f∗g)(x)=∑d∣xf(d)g(dx)
推论c.2:若 f(x),g(x) 为积性函数,那么 f∗g 为积性函数。
推论c.2:若 f(x),g(x) 为完全积性函数,那么 f∗g 为完全积性函数。
推论c.3:f∗h=g∗h⟺f∗g
-
f∗ϵ=f
-
μ∗I=ϵ(莫比乌斯反演)
-
φ∗I=id(欧拉反演)
-
μ∗id=φ(综上可证)
——qwq
道阻且长
1. 费马小定理&欧拉定理#
1.1. 费马小定理#
定理1.1.1:当存在整数 a 和质数 p 时,那么:
ap≡a(modp)
定理1.1.2:当整数 a 和质数 p 并且 gcd(a,p)=1 时,那么:
ap−1≡1(modp)
推论1.1.3:ab≡abmod(p−1)(modp)。读者自证不难。
证明1.1:oi-wiki.
看下文可以知道,费马小定理是欧拉定理的特殊情况。
1.2. 欧拉定理#
定义1.2.1:当 a,m∈Z ,且 gcd(a,m)=1 时有:aφ(m)≡1(modm)。
证明1.2.1:https://zhuanlan.zhihu.com/p/452185813
这里 φ(x) 是数论中的欧拉函数。∗1。
∗1:详见 4.1。
推论1.2.2:ab≡abmodφ(m)(modm)。
1.2.4 阶#
定义1.2.4.1:若存在最小非负整数x满足 ax≡1(modm),则称 x 为 a 模 m 的阶,记为 δm(a)。
根据欧拉定理,显然要满足 gcd(a,m)=1。
定理1.2.4.2:ax≡1(modm),则δm(a)∣x。
证明1.2.4.2:设 x=qd+r,其中 0≤r<δm(a),由于 δm(a) 最小,所以 q≥1。所以 ar≡ar(aδm(a))q≡aqδm(a)+r≡1(modm)。
于是r只能为0,得证。
定理1.2.4.3:a,a2,...,aδm(a) 模 m 意义下两两不同余。
证明1.2.4.3:考虑反证,假设存在两个数 i=j ,且 ai≡aj(modm) ,则有 a∣i−j∣≡1(modm) .但是显然的有:0<∣i−j∣<δm(a),这与阶的最小性矛盾,故原命题成立。
所以当 ap≡aq(modm) 时,p≡q(modδm(a))。
定理1.2.4.4:a,b 为整数,那么 gcd(δm(a),δm(b))=1 的充要条件是 δm(ab)=δm(a)δm(b)。
证明1.2.4.4:不会。
1.2.5 原根#
定义1.2.5.1:满足δm(a)=φ(m)的a,称 a 为模 m 的原根。
原根个数:φ(φ(m))。
原根判定:设 φ(m) 的质因数为 p1,...ps,那么 g 是 m 原根的充要条件是:对于任意 pi,满足 gpiφ(m)≡1(modm)。
证明:充分性显然。必要性不会
m 存在原根,当且仅当 m=2,4 或 m=pu,2pu,其中 u 为大于 2 的质数。
证明不会。
1.3. 扩展欧拉定理#
定义1.3.1:当 a,m∈Z 时有:
ab≡{ababmodφ(m)+φ(m),b<φ(m),b≥φ(m)(modm)
2. 裴蜀定理#
定义2.1:p,q 非零整数,则对于任意整数 a,b 使得 gcd(p,q)∣pa+pb,存在整数 a,b 使得 pa+pb=gcd(p,q)。
推广2.1:多个数也成立。
推论2.2:若 p,q 互质,则存在整数 a,b 使得 pa+qb=1。
证明2.2:设 pa+qb=m,其中 m 为可能的最小正整数。即证 m=1⟺m∣p,m∣q。
假设不成立,则 p=nm+r(0<r<m),可得 r=p−nm=p−n(pa+qb)=p(1−na)+q(−nb)。由于 1−na,−nb 为整数,所以 r 为比 m 更小的正整数,与 m 为可能的最小正整数不符,所以假设不成立,m=1。
3. 扩展欧几里得算法#
扩展欧几里得算法常用于求 ax+by=gcd(a,b) 的可行解。
以下是算法原理。
设
ax1+by1=gcd(a,b)
bx2+(amodb)y2=gcd(b,amodb)
由欧拉定理(gcd(a,b)=gcd(b,amodb))可得:
ax1+by1=bx2+(amodb)y2根据模的定义转换下,得:
ax1+by1=bx2+(a−⌊ba⌋b)y2再转换。
ax1+by1=ay2+b(x2−⌊ba⌋y2)现在,x1,y1 可以通过 x2,y2 来求了:
⎩⎨⎧x1=y2y1=x2−⌊ba⌋y2而 x2,y2 可以通过 x3,y3 来求,而 x3,y3 可以通过 x4,y4 来求…
很容易想到,递归。
我们把 ax≡1(modp) 转换一下,可得:
ax+py=1用扩展欧几里得算法求出 x,y,x 就是 a 在模 p 意义下的逆元。
int exgcd(int a , int b){ //返回值是 gcd(a,b)
int ret = exgcd(b , a % b);
inline pair <ll , ll> exgcd(ll a , ll b){ //不要gcd返回值
if(b == 0) return make_pair(1 , 0);
pair <ll , ll> ret = exgcd(b , a % b);
return make_pair(ret.second , ret.first - (a / b) * ret.second);
4. 欧拉函数#
4.1定义:对于正整数 n。欧拉函数是小于 n 的正整数中与 n 互质的数的个数。表示为 φ(n)。
其中欧拉函数是积性函数。笔者证明很难。
可以质因数分解来求。
for(int i = 2;i * i <= x;i++) if(x % i == 0){
while(x % i == 0) x /= i;
if(x > 1) ret -= ret / x;
4.2. 性质#
-
4.2.1:设 x=y∗pi。
当 x,y 均有质因子 pi 时,φ(x)=φ(y)∗pi。
否则 φ(x)=φ(y)∗(pi−1)。
证明:
可通过其,用线性筛来求。
int ppp[500005] , phi[500005] , cnt;
for(int i = 2;i <= 10000000;i++){
if(!vis[i]) phi[i] = i - 1 , ppp[++cnt] = i;
for(int j = 1;j <= cnt && i * ppp[j] <= 10000000;j++){
phi[i * ppp[j]] = phi[i] * ppp[j];
phi[i * ppp[j]] = phi[i] * phi[ppp[j]];
-
4.2.2:gcd(x,y)=1,φ(xy)=φ(x)φ(y)(积性函数)
-
4.2.3:φ(pk)=pk−1(p−1)
-
4.2.4:φ(x)=∏φ(pik)=n∏pipi−1
5. 筛法#
5.1. 线性筛#
O(n)
bool p[N];int ppp[N] , cnt;
for(int i = 2;i <= N;i++){
if(!p[i]) ppp[++cnt] = i;
for(int j = 1;j <= cnt && ppp[j] * i <= N;j++){
if(i % ppp[j] == 0) break;
可以考虑预处理出比 i 小的第一个质数,可以把分解质因数优化成 O(logn)。
for(int i = 2;i <= N;i++){
if(!vis[i]) ppp[++cnt] = i , minp[i] = i;
for(int j = 1;j <= cnt && ppp[j] * i <= N;j++){
minp[ppp[j] * i] = min(minp[ppp[j]] , minp[i]);
if(i % ppp[j] == 0) break;
积性函数基本可以用线性筛求。
5.2. 埃氏筛#
for(int i = 2;i <= n ;i++)
for(int j = i + i;j <= n;j += i)
5.3. 杜教筛#
用于在非线性时间内求积性函数前缀和。
假如求 S(n)=∑i=1nf(i)。
那么尝试找出一个合适的积性函数 g。它们的迪利克雷卷积的前缀和为:
i=1∑n(f∗g)(i)=d=1∑ng(d)S(⌊dn⌋)那么 g(1)S(n)=∑i=1n(f∗g)(i)−∑d=2ng(d)S(⌊dn⌋)。
代码如下:
int GetSum(int n) { // 算 f 前缀和的函数
int ans = f_g_sum(n); // 算 f * g 的前缀和
for(int l = 2 , r;l <= n;l = r + 1){
ans -= (g_sum(r) - g_sum(l - 1)) * GetSum(n / l);// g_sum 是 g 的前缀和
复杂度为 O(n43)。
6. 中国剩余定理#
常用于求
⎩⎨⎧x≡r1(modm1)x≡r2(modm2)...x≡rn(modmn)的最小可行解。
6.1. 求解#
前提:m 两两互质。
核心思路是把求出 n 个辅助解 xi,每个 xi 满足:
⎩⎨⎧xi≡0(modm1)xi≡0(modm2)...xi≡1(modmi)...xi≡0(modmn)最后的可行解就是:∑rixi。
现在考虑求出每组 xi。
对于 xi,设 m0 为可以整除 xi 的 m 的乘积,于是我们可以知道:xi=pm0=qmi−1。
移项得:qmi−pm0=1。
因为 mi,m0 互质,所以有解(裴蜀定理),然后方程可以用扩欧求解,或者看成逆元也行。
ll CRT(ll a[15] , ll m[15]){
for(int i = 1;i <= n;i++)
for(int i = 1;i <= n;i++){
ll t = (x + m[i]) % m[i];
ret += mmm * t * a[i] % M;
6.2. exCRT#
处理 m 不互质的情况。
可以考虑合并两个同余式子。有:
{x≡r1(modm1)x≡r2(modm2)那么:x=pm1+r1=qm2+r2,移项得 pm1−qm2=r2−r1
令 d=gcd(m1,m2),我们可以用 exgcd 求出方程 adm1+bdm2=gcd(dm1,dm2)=1 的一组解,那么:
⎩⎨⎧p=d(r2−r1)aq=d(r1−r2)b于是 x≡d(r2−r1)am1+r1(modlcm(m1,m2)),然后一个个合并直到剩下一个即可。
ll m0 , r0; scanf("%lld%lld" , &m0 , &r0); n--;
ll m , r; scanf("%lld%lld" , &m , &r);
ll x = (exgcd(m0 / d , m / d).first + t) % t;
r0 = (r0 + mul(mul((r - r0) / d , x , t) , m0 , t)) % t;
m0 = t; //mul(a,b,MOD) 慢速乘
7. 反演#
7.1. 莫比乌斯函数#
定义7.1.1:μ(n)=⎩⎨⎧1,n=10,∃p,n≡0(modp2)(−1)k(k 是 n 的质因子个数 )
推论7.1.2:∑d∣nμ(d)=[n=1]⟺μ∗I=ϵ
莫比乌斯函数为积性函数。
7.1.3. 莫比乌斯变换#
- 形式a:f(x)=∑d∣ng(d),那么有 g(n)=∑d∣nμ(d)f(dn)
证明a:已知 f=g∗I,欲证 g=f∗μ
f∗μ=g∗I∗μ=g∗ϵ=g 证毕。
- 形式b:f(x)=∑n∣dg(d),那么有 g(n)=∑n∣dμ(d)f(nd)
7.2. 欧拉反演#
n=∑d∣nφ(d)
7.3. 反演技巧#
构造函数强行反演:
假如求 ∑∑f(gcd(i,j))
那么提前求出所有 f(i)。
再令 f(i)=f(i)−∑d∣i&d=if(d)
于是 f(i)=∑d∣if(d)。
下面给出模板 O(nlnn):
for(int i = 1;i <= N;i++) f[i] = xx; //预处理f
for(int i = 1;i <= N;i++) for(int j = i + i;j <= N;j += i)
例题:
P4449 于神之怒加强版
∑∑gcd(i,j)k
那么设 f(x)=xk
所以 ∑∑f(gcd(i,j))
反演 ∑∑∑d∣gcd(i,j)f(d)
∑d=1nf(d)⌊dn⌋⌊dn⌋
预处理 f 前缀和,数列分块求解。
扩展:
不是求和怎么办??
同理
f(i)=∏d∣i&d=if(d)f(i)
于是 f(i)=∏d∣if(d)。
a. 排列组合#
定义a.1:Anm 表示从 n 里选 m 个进行排列的方案数。
定义a.2:Anm=(n−m)!n!
定义a.3:Cnm 表示从 n 中选 m 个(不考虑顺序)的方案数。
定义a.4:Cnm=AmmAnm=m!(n−m)!n!
推论a.5:Cnm=Cn−1m+Cn−1m−1。不难发现,此乃杨辉三角。
理论到实际#
zbj 问题#
每个数值域为 [1,m],n 个数单增的数量为 Cmn
不降的是 Cn+m−1n−1。
n 个 zbj 放到 m 个箱子中,每个箱子至少一个,Cn−1m−1。
n 个 zbj 放到 m 个箱子中,可以先每个箱子放一个,所以Cn+m−1m−1。
数论分块#
用于求
i=1∑n⌊in⌋
for(int l = 1 , r;l <= n;l = r + 1){
ret += (r - l + 1) * (n / l);
斐波那契数列#
F0=0,F1=1Fn=Fn−1+Fn−2(1)Fn=51[(21+5)n−(21−5)n]
设
Fn−λFn−1=μ(Fn−1−λFn−2)(2)Fn=(μ+λ)Fn−1−μλFn−2根据 (1) 得:
{μ+λμλ=1=−1解得:
{μ=21+5λ=21−5or{μ=21−5λ=21+5分别带回 (2):
{Fn−21−5Fn−1=21+5(Fn−1−21−5Fn−2)Fn−21+5Fn−1=21−5(Fn−1−21+5Fn−2)显然数列 {Fn−λFn−1} 为等比数列,公差为 21+5 或 21−5。则:
⎩⎨⎧Fn−21−5Fn−1=(F2−21−5F1)(21+5)n−1Fn−21+5Fn−1=(F2−21+5F1)(21−5)n−1(3)(4)然后
21+5×(3)−21−5×(4)得
5Fn=(21+5)n−(21−5)nFn=51[(21+5)n−(21−5)n]由上可以发现:
{μ=ϕ1=21+5λ=ϕ=21−5or{μ=ϕ=21−5λ=ϕ1=21+5(ϕ 指黄金分割比 25−1)
所以通项公式可以写成:
Fn=51(ϕ−n−ϕn)时间复杂度相关#
代换法#
T(n)=2T(⌊2n⌋)+n
直觉
T(n)≤cnlog2n所以
T(⌊2n⌋)≤c⌊2n⌋log2⌊2n⌋带回原式
T(n)≤2c⌊2n⌋log2⌊2n⌋+n≤cnlog22n+n=cnlog2n−cn+n≤cnlog2nc≥1 时成立。
小公式#
(a+b)3=(a2+ab)(a+b)+(ab+b2)(a+b)=a3+b3+3a2b+3ab2
(a−b)3=a3−b3−3a2b+3ab2
a3+b3=(a+b)(a2−ab+b2)
a3−b3=(a−b)(a2+ab+b2)
(a+b)n=k=0∑nCknxn−kyk=k=0∑nCknxkyn−k
i=1∑ni2=6n(n+1)(2n+1)
i=1∑ni3=4(n+1)2n2
当 n 是正奇数时
an+bn=(a+b)(an−1−an−2b+an−3b2−...−abn−2+bn−1)
对于 f(x)=anxn+an−1xn−1+...+a1x+a0
当 f(c)=0 时,设有理数根 c=qp(p,q 互质)。
x−c 除 f(x) 时,余数是 f(c)。