#序言:
博主是个蒟蒻…各类链接跟归纳,
如果有什么问题,可以在留言区询问,
勿喷哦,%%%dalao
【---------------------------------】
0.csdn数学符号:
#传送门
【---------------------------------】
1.树链剖分:
#传送门1
#传送门2
【---------------------------------】
2.组合数各类性质,定理:
#传送门1
【---------------------------------】
3.位运算:
(1)取出整数N在二进制表示下的第K位:(N>>K) & 1
(2)取出整数N在二进制表示下的第0~K-1位(后K位):N &((1<<K)-1)
(3)把整数N在二进制表示下的第K位取反:N xor (1<<K)
(4)对整数N在二进制表示下的第K位赋值1:N | (1<<K)
(5)对整数N在二进制表示下的第K位赋值0:N & (~(1<<K))
【---------------------------------】
4.树状数组:
#传送门1
【---------------------------------】
5.欧拉函数:
#传送门1
#传送门2
【---------------------------------】
6.FFT:
#传送门1
【---------------------------------】
7.欧几里德算法:
对
于
任
意
a
,
b
,
1
≤
a
,
b
≤
N
,
b
≠
0
对于任意a,b,1≤a,b≤N,b≠0
对于任意a,b,1≤a,b≤N,b=0
则
g
c
d
(
a
,
b
)
gcd(a,b)
gcd(a,b)
=
=
=
g
c
d
(
b
,
a
gcd(b,a
gcd(b,a
m
o
d
mod
mod
b
)
b)
b)
证明:
① 当
a
≤
b
a ≤ b
a≤b,则,
g
c
d
(
b
,
a
gcd(b,a
gcd(b,a
m
o
d
mod
mod
b
)
b )
b)
=
=
=
g
c
d
(
b
,
a
)
gcd(b,a)
gcd(b,a) =
g
c
d
(
a
,
b
)
gcd(a,b)
gcd(a,b)
② 当
a
≥
b
a ≥ b
a≥b,则,
设
a
=
q
∗
b
+
r
a = q * b + r
a=q∗b+r,显然
r
=
a
r = a
r=a
m
o
d
mod
mod
b
b
b。
对于
a
,
b
a,b
a,b的任意一个公约数d,
显然可得出,
d
d
d
∣
|
∣
a
a
a 且
d
d
d
∣
|
∣
b
b
b
因为
d
d
d
∣
|
∣
b
b
b,所以可得
d
d
d
∣
|
∣
q
∗
b
q * b
q∗b
因为
d
d
d
∣
|
∣
q
∗
b
q * b
q∗b 且
d
d
d
∣
|
∣
a
a
a
所以可得
d
d
d
∣
|
∣ (
a
−
q
∗
b
a-q*b
a−q∗b)
即
d
d
d
∣
|
∣
r
r
r,
即
d
d
d
∣
|
∣ (
a
a
a
m
o
d
mod
mod
b
b
b)
所以证出,
a
,
b
a,b
a,b的公约数集合,与
b
,
a
b,a
b,a
m
o
d
mod
mod
b
b
b的公约数集合是相同的
因此,我们可以知道他们的最大公约数相同,
即
g
c
d
(
a
,
b
)
gcd(a,b)
gcd(a,b)
=
=
=
g
c
d
(
b
,
a
gcd(b,a
gcd(b,a
m
o
d
mod
mod
b
)
b)
b)
【---------------------------------】
8.拓展欧几里德算法:
贝祖定理:
对
于
任
意
a
,
b
,
存
在
一
对
整
数
x
,
y
,
满
足
a
x
+
b
y
=
g
c
d
(
a
,
b
)
对于任意a,b,存在一对整数x,y,满足ax+by =gcd(a,b)
对于任意a,b,存在一对整数x,y,满足ax+by=gcd(a,b)
证明:
①当
b
=
0
b=0
b=0时,显然有一对整数解x = 1,y = 0,使其满足
即
a
∗
1
+
0
∗
0
=
g
c
d
(
a
,
0
)
=
a
a * 1 + 0 * 0 = gcd(a,0) = a
a∗1+0∗0=gcd(a,0)=a
ps:任意正整数x,
g
c
d
(
x
,
0
)
=
g
c
d
(
0
,
x
)
=
x
gcd(x,0) = gcd(0,x)= x
gcd(x,0)=gcd(0,x)=x
②当
b
>
0
b>0
b>0时,
因为
g
c
d
(
a
,
b
)
=
g
c
d
(
b
,
a
gcd(a,b) = gcd(b,a
gcd(a,b)=gcd(b,a
m
o
d
mod
mod
b
)
b)
b) (在第7点时已证
所以当存在一对整数解x,y
满足
$b * x + (a $
m
o
d
mod
mod
b
)
∗
y
=
b)*y =
b)∗y=
g
c
d
(
b
,
a
gcd(b,a
gcd(b,a
m
o
d
mod
mod
b
)
b)
b)
由于
$b * x + (a $
m
o
d
mod
mod
b
)
∗
y
=
b)*y =
b)∗y=
b
∗
x
+
(
a
−
b
b *x+(a-b
b∗x+(a−b
⌊
a
/
b
⌋
)
∗
y
=
\left \lfloor a/b \right \rfloor )*y=
⌊a/b⌋)∗y=
a
∗
y
−
b
(
−
x
+
a *y-b(-x+
a∗y−b(−x+
⌊
a
/
b
⌋
∗
y
)
=
\left \lfloor a/b \right \rfloor*y)=
⌊a/b⌋∗y)=
a
∗
y
+
b
(
x
−
a *y+b(x-
a∗y+b(x−
⌊
a
/
b
⌋
∗
y
)
\left \lfloor a/b \right \rfloor*y)
⌊a/b⌋∗y)
此时我们可以令,
x
′
=
y
x'=y
x′=y
y
′
=
x
−
y'=x-
y′=x−
⌊
a
/
b
⌋
∗
y
\left \lfloor a/b \right \rfloor*y
⌊a/b⌋∗y
则显然能得到,
a
x
′
+
b
y
′
=
g
c
d
(
a
,
b
)
ax'+by'=gcd(a,b)
ax′+by′=gcd(a,b)
所以我们可以在求解gcd的过程中运用数学归纳法,
可以知道贝祖定理成立。
【---------------------------------】
9.高斯消元:
#传送门1
【---------------------------------】
10.莫比乌斯反演:
#传送门1
f
(
n
)
=
∑
d
∣
n
g
(
d
)
<
−
>
g
(
n
)
=
∑
d
∣
n
f
(
n
/
d
)
μ
(
d
)
f(n)=\sum_{d|n} g(d) <->g(n)=\sum_{d|n}f(n/d)μ(d)
f(n)=∑d∣ng(d)<−>g(n)=∑d∣nf(n/d)μ(d)
证明:
g
(
n
)
=
∑
d
∣
n
f
(
n
/
d
)
μ
(
d
)
g(n)=\sum_{d|n}f(n/d)μ(d)
g(n)=∑d∣nf(n/d)μ(d)
=
∑
d
∣
n
μ
(
d
)
∑
k
∣
(
n
/
d
)
g
(
k
)
=\sum_{d|n}μ(d)\sum_{k|(n/d)}g(k)
=∑d∣nμ(d)∑k∣(n/d)g(k)
=
∑
k
∣
n
g
(
k
)
∑
d
∣
(
n
/
k
)
,
d
∣
n
μ
(
d
)
=\sum_{k|n}g(k)\sum_{d|(n/k),d|n}μ(d)
=∑k∣ng(k)∑d∣(n/k),d∣nμ(d)
因为
g
c
d
(
n
/
k
,
n
)
=
n
/
k
gcd(n/k,n)=n/k
gcd(n/k,n)=n/k,则
=
∑
k
∣
n
g
(
k
)
∑
d
∣
(
n
/
k
)
μ
(
d
)
=\sum_{k|n}g(k)\sum_{d|(n/k)}μ(d)
=∑k∣ng(k)∑d∣(n/k)μ(d)
因为
n
=
1
n=1
n=1,
∑
d
∣
n
μ
(
n
)
=
1
\sum_{d|n}μ(n)=1
∑d∣nμ(n)=1
n
≠
1
n≠1
n=1,
∑
d
∣
n
μ
(
n
)
=
0
\sum_{d|n}μ(n)=0
∑d∣nμ(n)=0
则
当且仅当
n
/
k
=
1
n/k=1
n/k=1时对
g
n
g_n
gn会产生贡献
则
k
=
n
k=n
k=n才对答案有贡献,
贡献仅有
g
(
n
)
∗
1
=
g
n
g(n)*1=g_n
g(n)∗1=gn,得证
【---------------------------------】
f
(
n
)
=
∑
n
∣
d
g
(
d
)
<
−
>
g
(
n
)
=
∑
n
∣
d
μ
(
d
/
n
)
f
(
d
)
f(n)=\sum_{n|d}g(d)<->g(n)=\sum_{n|d}μ(d/n)f(d)
f(n)=∑n∣dg(d)<−>g(n)=∑n∣dμ(d/n)f(d)
证明:
g
(
n
)
=
∑
n
∣
d
μ
(
d
/
n
)
f
(
d
)
g(n)=\sum_{n|d}μ(d/n)f(d)
g(n)=∑n∣dμ(d/n)f(d)
=
∑
n
∣
d
μ
(
d
/
n
)
∑
d
∣
k
g
(
k
)
=\sum_{n|d}μ(d/n)\sum_{d|k}g(k)
=∑n∣dμ(d/n)∑d∣kg(k)
=
∑
n
∣
k
g
k
∑
d
∣
k
,
n
∣
d
μ
(
d
/
n
)
=\sum_{n|k}g_k\sum_{d|k,n|d}μ(d/n)
=∑n∣kgk∑d∣k,n∣dμ(d/n)
设
k
=
s
∗
n
,
d
=
c
∗
n
k=s*n,d=c*n
k=s∗n,d=c∗n,
因为
d
∣
k
d|k
d∣k,所以有
c
∣
s
c|s
c∣s,则
=
∑
n
∣
k
g
k
∑
c
∣
s
μ
(
c
)
=\sum_{n|k}g_k\sum_{c|s}μ(c)
=∑n∣kgk∑c∣sμ(c)
因为
n
=
1
n=1
n=1,
∑
d
∣
n
μ
(
n
)
=
1
\sum_{d|n}μ(n)=1
∑d∣nμ(n)=1
n
≠
1
n≠1
n=1,
∑
d
∣
n
μ
(
n
)
=
0
\sum_{d|n}μ(n)=0
∑d∣nμ(n)=0
则
当且仅当
s
=
1
s=1
s=1时对
g
n
g_n
gn会产生贡献
则
k
=
n
k=n
k=n才对答案有贡献,
贡献仅有
g
n
∗
1
=
g
n
g_n*1=g_n
gn∗1=gn,得证
【---------------------------------】
11.set
set t —— 定义一个int类型的容器,注意set里的每个元素只会出现1次
t.insert(k) —— 插入元素k,多次插入同一个元素后面无效
t.count(k) —— 判断元素k是否在容器内
t.erase(k) —— 删除元素k,若不存在则删除无效
t.clear() —— 清空容器
t.size() —— 返回容器现有元素个数
t.empty() —— 判断容器是否为空
想遍历set里的元素或进行进一步修改,必须定义对应迭代器,以下三种定义方法(迭代器类似于指针)
set::iterator it —— 定义正向迭代器
set::reverse_iterator rit; —— 定义反向迭代器
auto it = t.begin(); —— 因t.begin()返回正向迭代器,所以it自动被定义为正向迭代器,可适应其他所有操作
以下需要迭代器的操作:
t.begin() —— 返回set中第一个元素,类型为正向迭代器
t.rbegin() —— 返回set中最后一个元素,类型为反向迭代器
t.end() —— 返回set中最后一个元素,类型为正向迭代器
t.rend() —— 返回set中第一个元素,类型为反向迭代器
t.find(k) —— 寻找k,若找到返回对应的迭代器,否则返回end();
t.insert(a, b) —— 插入指针[a, b)之间的元素,已有元素不会再次插入
t.erase(it) —— 删除迭代器it对应的元素
t.erase(l, r) —— 删除迭代器[l, r)之间的元素
lower_bound(k) —— 返回第一个大于等于k的元素的迭代器
upper_bound(k) —— 返回第一个大于k的元素的迭代器
【---------------------------------】
12.cdp分治:
#传送门1
13.逆元:
当p是个质数的时候有
inv(a) = (p - p / a) * inv(p % a) % p
证明:
14.快速乘:
inline ll ksc(ll x, ll y, ll P){
ll L=x*(y>>25)%P*(1<<25)%P;
ll R=x*(y&((1<<25)-1))%P;
return (L+R)%P;
}
15.欧拉函数.
φ
(
i
∗
j
)
=
φ
(
j
)
∗
i
φ(i*j)=φ(j)*i
φ(i∗j)=φ(j)∗i当
i
∣
j
i|j
i∣j时
证明:
令
j
=
k
∗
i
j=k*i
j=k∗i,
则若
i
=
p
1
a
1
∗
p
2
a
2
∗
.
.
.
∗
p
c
a
c
i=p_1^{a_1}*p_2^{a_2}*...*p_{c}^{a_c}
i=p1a1∗p2a2∗...∗pcac
那么
j
=
k
∗
p
1
a
1
∗
p
2
a
2
∗
.
.
.
∗
p
c
a
c
j=k*p_1^{a_1}*p_2^{a_2}*...*p_{c}^{a_c}
j=k∗p1a1∗p2a2∗...∗pcac
φ
(
i
∗
j
)
=
i
∗
j
∗
π
i
=
1
l
(
(
p
l
−
1
)
/
p
l
)
φ(i*j)=i*j*π_{i=1}^{l}((p_l-1)/p_l)
φ(i∗j)=i∗j∗πi=1l((pl−1)/pl)
因为对于i的素因子,必定被j包含,而j中的因子k,将k素因数分解以后的p与i中的p不同的值则是j素因数分解下与i不同的p部分
那么对于i*j的素因子而言,显然种类就是等于j的素因子
则
j
∗
π
i
=
1
l
(
(
p
l
−
1
)
/
p
l
)
=
φ
(
j
)
j*π_{i=1}^{l}((p_l-1)/p_l)=φ(j)
j∗πi=1l((pl−1)/pl)=φ(j)
那么
φ
(
i
∗
j
)
=
φ
(
j
)
∗
i
φ(i*j)=φ(j)*i
φ(i∗j)=φ(j)∗i
inline ll ksc(ll x,ll y,ll mod)
{
return (x*y-(ll)((long double)x/mod*y)*mod+mod)%mod;
}