emmm…蒟蒻第一次出来集训,也是2019年noip(现在应该叫csp的说)前最后一次外出集训…
感觉压力好大啊…毕竟才学了不到一年啊…
但不管怎样,接下来几天要好好加油啊!
DAY1
仅自己用的链接(file:///C:/Users/Belief、御风/Desktop/19.7.28)
主讲概率与期望。
基础概念:
(概率与期望入门必备知识)
1、随机变量:有多种可能的取值的变量
2、
P
(
a
)
P(a)
P(a):事件
a
a
a发⽣的概率
3、
E
(
x
)
E(x)
E(x):随机变量
x
x
x的期望值,
E
(
x
)
=
∑
P
(
x
=
i
)
∗
i
E(x)=\sum P(x=i)*i
E(x)=∑P(x=i)∗i
4、独⽴事件:互相不影响的事件,满⾜
P
(
a
b
)
=
P
(
a
)
P
(
b
)
P(ab)=P(a)P(b)
P(ab)=P(a)P(b)
5、对于独⽴事件,我们有
E
(
a
b
)
=
E
(
a
)
E
(
b
)
E(ab)=E(a)E(b)
E(ab)=E(a)E(b)
6、当
0
<
x
<
1
0<x<1
0<x<1 时,
∑
i
=
0
∞
x
i
=
1
1
−
x
\sum^\infty_{i=0} x^i=\frac 1{1-x}
∑i=0∞xi=1−x1,
∑
i
=
0
n
x
i
=
1
−
x
n
+
1
1
−
x
\sum^n_{i=0} x^i=\frac{1-x^{n+1}}{1-x}
∑i=0nxi=1−x1−xn+1
7、期望的线性性:
E
(
x
+
y
)
=
E
(
x
)
+
E
(
y
)
E(x+y)=E(x)+E(y)
E(x+y)=E(x)+E(y)
常用技巧:
(介绍前缀和这一技巧)
1、对于离散变量
x
x
x,
P
(
x
=
k
)
=
P
(
x
<
=
k
)
−
P
(
x
<
=
k
−
1
)
P(x=k)=P(x<=k)-P(x<=k-1)
P(x=k)=P(x<=k)−P(x<=k−1)
2、有
n
n
n个随机变量
x
[
1
…
n
]
x[1…n]
x[1…n],每个随机变量都是从
1
…
s
1…s
1…s中随机⼀个整数,求
m
a
x
(
x
[
1
…
n
]
)
max(x[1…n])
max(x[1…n])的期望
3、概率为
p
p
p的事件期望
1
/
p
1/p
1/p次后发⽣
emmm…
今天的话听课感觉还好,基本能听懂和理解但可能实际使用会emmm…毕竟我发现我代码能力有点菜。
所以还是在课后好好敲一下看吧。
然后…
老师推荐的神题???:
经典拿球问题和游走问题,嗯,帮助理解了一下,结果变式依然那么…
接下来又是经(mo)典(gui)的10个例题…
1、每次随机⼀个
[
1
,
n
]
[1,n]
[1,n] 的整数,问期望⼏次能凑⻬所有数
2、随机⼀个⻓度为
n
n
n 个排列
p
p
p,求
p
[
1
…
i
]
p[1…i]
p[1…i] 中
p
[
i
]
p[i]
p[i] 是最⼤的数的概率
3、问满⾜上⾯那个题的
i
i
i 的个数的平⽅的期望
4、随机⼀个⻓度为
n
n
n 的排列
p
p
p,求
i
i
i 在
j
j
j 的后⾯的概率
5、随机⼀个⻓度为
n
n
n 的排列
p
p
p,求它包含
w
[
1
…
m
]
w[1…m]
w[1…m] 作为⼦序列/连续⼦序列的概率
6、有
n
n
n 堆⽯头,第
i
i
i 堆个数为
a
[
i
]
a[i]
a[i],每次随机选⼀个⽯头然后把那⼀整堆都扔了,求第
1
1
1 堆⽯头期望第⼏次被扔
7、随机⼀个⻓度为
n
n
n 的01串,每个位置是
1
1
1 的概率是
p
p
p ,定义
x
x
x 是每段连续的
1
1
1 的⻓度的平⽅之和,求
E
(
x
)
E(x)
E(x)
8、给⼀个序列,每次随机删除⼀个元素,问
i
i
i 和
j
j
j 在过程中相邻的概率
9、给定⼀棵树,将他的边随机⼀个顺序后依次插⼊,求
u
,
v
u,v
u,v 期望什么时候连通
10、给
1
…
n
1…n
1…n 这
n
n
n 个数,每次随机选择⼀个还在的数并且删掉他的所有约数,求期望⼏次删完
还有鬼畜期望线性性练习题???:
1、给定
n
n
n 个硬币,第
i
i
i 个硬币的价值为
w
[
i
]
w[i]
w[i],每次随机取⾛一个硬币,获得的收益是左右两个硬币的价值的乘积,求期望总价值
2、有
n
n
n 个数
a
[
1
…
n
]
a[1…n]
a[1…n],每次等概率选出两个数,然后合并成一个新的数放回来,得到的收益是新的数的值,求总收益的期望
3、给定一个数列列
w
[
1
…
n
]
w[1…n]
w[1…n],随机一个排列列
h
h
h,如果
h
[
i
]
h[i]
h[i] ⽐比
h
[
i
−
1
]
h[i-1]
h[i−1] 和
h
[
i
+
1
]
h[i+1]
h[i+1] 都大,就获得
w
[
i
]
w[i]
w[i] 的收益,求期望收益
4、给出一棵树,一开始每个点都是白的,每次选一个白点将他子树里所有点染黑,求期望几次染黑整个树
5、有
n
n
n 个⿊黑球,
m
m
m 个⽩白球,每次等概率取出一个球(不放回),将取出来的球的颜⾊色写成一个01序列列,求 ”01” 的期望出现次数
嗯,听的有点绕,要好好消化。。。
另外地方要找题多做啊。
DAY2
仅自己用的链接(file:///C:/Users/Belief、御风/Desktop/19.7.29)
emmm…本来准备昨天讲的分治被拖到了今天。
简单介绍一下:
分治即分而治之,是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
比较普通的分治:
1、求所有区间的最大值之和
2、求所有区间的最大值乘最小值之和
3、求所有区间的gcd之和
4、求二维平面上最近点对
5、分治多项式乘法
(这些都可以通过将区间分成两个区间,来将问题分成两个⼦子问题)
介绍下二分:
二分其实是对答案进行分治,是分数规划问题。
(可以去了解一下整体二分)
CDQ分治:
把
[
l
,
r
]
[l,r]
[l,r] 分成
[
l
,
m
i
d
]
[l,mid]
[l,mid] 和
[
m
i
d
+
1
,
r
]
[mid+1,r]
[mid+1,r],考虑左边对右边的贡献。
题目有三维偏序,矩阵加,矩阵求和,缺1背包问题,缺点最短路问题,解地推式
f
[
n
]
=
∑
f
[
i
]
∗
g
[
n
−
i
]
f[n]=\sum f[i]*g[n-i]
f[n]=∑f[i]∗g[n−i]
点分治:
基于树上的节点进行分治,本质其实是将一棵树拆分成许多棵子树处理,并不断进行,点分治是处理树上路径的一个极好的工具,一般如果需要大规模处理树上路径,点分治是一个不错的选择。
时间分治:
加边删边询问两点是否连通
然后讲图论惹。
这个不详细说了,多找找题目做吧,特别注意Tarjan,圈套圈,最短路变式,二分图,Hall定理应用,判断偶环。
一些基础术语:
出度,入度,度数,无向图,有向图,欧拉回路,哈密尔顿回路,环,简单环,连通块,强连通块,点双连通分量,边双连通分量,深度优先搜索(dfs),广度优先搜索(bfs)
一些基本算法:
Dijkstra,Bellman-Ford,SPFA(以及卡掉它的办法),Floyd 算法,Tarjan,圈套圈
一些题目类型:
判断负环,差分约束,次短路,最短路变式,求桥,求强联通分量,数环,欧拉回路,最小生成树,Prufer序列,二分图,Hall定理应用
接下来是字符串。
字符串不是很好,还需要多思考一下。
Hash:
比较两个字符串是否相等
KMP(还有AC自动机):
求两字符串最长的相等前后缀或一个串的最小循环节
后缀数组:
用来求最长重复子串,不可重叠最长重复子串,本质不同的子串个数,求 S[l…r] 的出现次数,高度总结一个公式
l
c
p
(
x
,
y
)
=
m
i
n
(
h
[
p
[
x
]
]
.
.
.
h
[
p
[
y
]
−
1
]
)
lcp(x,y)=min(h[p[x]]...h[p[y]-1])
lcp(x,y)=min(h[p[x]]...h[p[y]−1]),然后我这块挂了。
后缀自动机:
有个后缀树需要了解,这块也挂了,不介绍过多了。。。
DAY3
仅自己用的链接(file:///C:/Users/Belief、御风/Desktop/19.7.30)
组合计数。
介绍容斥原理:
列出题目中的
n
n
n 个条件,求满足这
n
n
n 个条件中每一个的方案的个数
枚举这些条件的所有
2
n
2^n
2n 个集合,考虑一个集合
p
p
p,令不满足
p
p
p 中所有条件的方案有
a
a
a 个,如果
p
p
p的大小是奇数,给答案减去
a
a
a,不然给答案加上
a
a
a
欧拉函数:
求
[
1
,
n
]
[1,n]
[1,n] 之间与
n
n
n 互质的数的个数
枚举每个因子放与不放
说一下补集思想:
正难则反,满足条件的=全部的-不满足条件的
连通图的数量:
连通图的数量=图的总数-不连通图的数量,而不连通数量可以计算。
欧拉图的数量也能用相同的方法计算。
线性性:
一般在求期望中使用的
E
(
x
+
y
)
=
E
(
x
)
+
E
(
y
)
E(x+y)=E(x)+E(y)
E(x+y)=E(x)+E(y) 在组合计数时也可以用,具体考虑每个元素对答案的贡献
Burnside引理:
x
x
x 在置换
G
G
G 作用下的轨道等于每个置换群下不动元素的和除掉
G
G
G 的大小
之后就在讲杂题惹
DAY4
仅自己用的链接(file:///C:/Users/Belief、御风/Desktop/19.7.31)
上午三个人一组ACM
呃,5个小时11道题我们只过了5题,真的是太菜了呀。要知道都有人ak了呀!!!(不过听说这是正睿史上第一次ACM赛有人ak。。。)
开场1,2两题想的太复杂老半天没做出来。后面抱着侥幸心理试一下暴力,然后过了。。。
之后我开始弄我jio得可能可以的题(真香),另外两个队友在讨论另外一道,结果看的两道题我都无法实现,叫队友帮忙,结果尝试还是过不了,索性切了题。然后我过了一道,队友过了一道,又回来看之前两道中的一道,搞了半天过了。然后一看时间不够了,索性弃疗吃饭去吧。
下午讲解
听了1,2题,才明白其实这就是正解。
听老师说自己预期的签到题没什么人过,明明很难好吧。。。
另外基本也听懂了,就是赛后要好好消化一下啊。
然后,果然队员还是很有用很重要的啊,虽然这次真的不怎么好(49个队,35名),不过重在参与吧。
要加油啊。
DAY5
仅自己用的链接(file:///C:/Users/Belief、御风/Desktop/19.8.1)
初次接触网络流
介绍下定义:
一个网络流
G
=
(
V
,
E
)
G=(V,E)
G=(V,E) 为一张满足一下条件的有向图:
1、每一条边有一个非负容量,即对于任意
E
E
E 中的
(
u
,
v
)
(u,v)
(u,v),有
c
(
u
,
v
)
>
=
0
c(u,v)>=0
c(u,v)>=0
2、如果
G
G
G 中存在边
(
u
,
v
)
(u,v)
(u,v),那么不存在
(
v
,
u
)
(v,u)
(v,u)。我们将图中不存在的边的容量定为0
3、图中含有两个特殊节点(源
s
s
s 和汇
t
t
t)
一个流可看作是从
V
∗
V
V*V
V∗V 到
R
R
R 的映射,满足下面两条性质:
1、容量限制:对于任意的
u
,
v
u,v
u,v,
0
<
=
f
(
u
,
v
)
<
=
c
(
u
,
v
)
0<=f(u,v)<=c(u,v)
0<=f(u,v)<=c(u,v)
2、流量守恒:对于任何非源汇的中间节点
u
u
u,满足
∑
v
∈
V
f
(
v
,
u
)
=
∑
v
∈
V
f
(
u
,
v
)
\sum_{v\in V} f(v,u)=\sum_{v\in V} f(u,v)
∑v∈Vf(v,u)=∑v∈Vf(u,v)
最大流问题:
找出一个满足上述条件的
f
f
f,使得
∑
v
∈
V
f
(
s
,
v
)
\sum_{v\in V} f(s,v)
∑v∈Vf(s,v) 被最大化,一个流
∣
f
∣
|f|
∣f∣ 定义为
∣
f
∣
=
∑
v
∈
V
f
(
s
,
v
)
−
∑
v
∈
V
f
(
v
,
s
)
|f|=\sum_{v\in V} f(s,v)-\sum_{v\in V} f(v,s)
∣f∣=∑v∈Vf(s,v)−∑v∈Vf(v,s)(由于在
G
G
G 图中不存在反向边,因而在上面的讨论中只需要最大化前半部分)
拓展带反向边的最大流问题和多源汇最大流问题
建模:
1、是否存在从s到t的可经过相同节点不经过相同边的两条路径?
2、是否存在从s到t的不可经过除s、t外相同节点的两条路径?
3、是否存在从s到t的不可经过除s、t外相同节点和相同边的两条路径?
点容量解决方法:拆点,将容量限制转化到边上
最大流的基本想法:
残量网络:
1、对于网络G,其残量网络G_f与G的差别在于每条边的边容量修改为G中边容 量减去当前流的该边流量。具体来说,
c
f
(
u
,
v
)
=
c
(
u
,
v
)
−
f
(
u
,
v
)
c_f (u,v)=c(u,v)-f(u,v)
cf(u,v)=c(u,v)−f(u,v)
2、另外,残量网络中还包含原图中所有边的反向边,容量等同于正向边在f中 当前流量,用于“反悔”时将流送回起点:
c
f
(
v
,
u
)
=
f
(
u
,
v
)
c_f (v,u)=f(u,v)
cf(v,u)=f(u,v)
增广:
令
f
′
f'
f′ 为残量网络
G
f
G_f
Gf 上的一个流
(
f
↑
f
′
)
(
u
,
v
)
=
(
u
,
v
)
∈
E
?
f
(
u
,
v
)
+
f
′
(
u
,
v
)
−
f
(
v
,
u
)
:
0
(f\uarr f')(u,v)= (u,v)\in E ? f(u,v)+f'(u,v)-f(v,u) : 0
(f↑f′)(u,v)=(u,v)∈E?f(u,v)+f′(u,v)−f(v,u):0
引理1:
增广后的网络的流量等于两个流流量直接相加
因为这是流(那条性质)而且流量相同,所以
∣
f
↑
f
′
∣
=
∣
f
∣
+
∣
f
′
∣
|f\uarr f'|=|f|+|f'|
∣f↑f′∣=∣f∣+∣f′∣
增广路:
1、残量网络当中
s
s
s 到
t
t
t 的一条简单路径
2、增广路
p
p
p 的流量定义为
c
f
(
p
)
=
m
i
n
(
u
,
v
)
:
(
u
,
v
)
∈
p
c_f (p)=min{(u,v):(u,v) \in p}
cf(p)=min(u,v):(u,v)∈p
3、若是将
p
p
p 上的每条边的流量均赋为
c
f
(
p
)
c_f (p)
cf(p),所形成的依然是满足条件的原图的一个流
结论1:
增广后流量增加,即令
f
p
f_p
fp 为当前流f的残量网络中找到的一增广路,则
∣
f
↑
f
p
∣
=
∣
f
∣
+
∣
f
p
∣
>
∣
f
∣
|f\uarr f_p|=|f|+|f_p|>|f|
∣f↑fp∣=∣f∣+∣fp∣>∣f∣
割:
为一个对于点集
V
V
V 的划分,将
V
V
V 划分为两个集合
S
S
S 与
T
T
T,其中源点
s
s
s 在
S
S
S 中,汇点
t
t
t 在
T
T
T 中。对于一个流
f
f
f 而言,割
(
S
,
T
)
(S,T)
(S,T) 间的网络流定义为
f
(
S
,
T
)
=
∑
u
∈
S
∑
v
∈
T
f
(
u
,
v
)
−
∑
u
∈
S
∑
v
∈
T
f
(
v
,
u
)
f(S,T)=\sum_{u\in S} \sum_{v\in T} f(u,v)-\sum_{u\in S} \sum_{v\in T} f(v,u)
f(S,T)=∑u∈S∑v∈Tf(u,v)−∑u∈S∑v∈Tf(v,u)
割
(
S
,
T
)
(S,T)
(S,T) 的容量定义为
c
(
S
,
T
)
=
∑
u
∈
S
∑
v
∈
T
c
(
u
,
v
)
c(S,T)=\sum_{u\in S} \sum_{v\in T} c(u,v)
c(S,T)=∑u∈S∑v∈Tc(u,v)
对一个网络而言,最小割为所有的割当中容量最小的那个
引理2:
由流量守恒导出,对于任意流
f
f
f,任意割之间的网络流量不变,即
f
(
S
,
T
)
=
∣
f
∣
f(S,T)=|f|
f(S,T)=∣f∣
结论2:
∣
f
∣
=
f
(
S
,
T
)
=
∑
u
∈
S
∑
v
∈
T
f
(
u
,
v
)
−
∑
u
∈
S
∑
v
∈
T
f
(
v
,
u
)
<
=
∑
u
∈
S
∑
v
∈
T
f
(
u
,
v
)
<
=
∑
u
∈
S
∑
v
∈
T
c
(
u
,
v
)
=
c
(
S
,
T
)
|f|=f(S,T)=\sum_{u\in S} \sum_{v\in T} f(u,v)-\sum_{u\in S} \sum_{v\in T} f(v,u)<=\sum_{u\in S} \sum_{v\in T} f(u,v)<=\sum_{u\in S} \sum_{v\in T} c(u,v)=c(S,T)
∣f∣=f(S,T)=∑u∈S∑v∈Tf(u,v)−∑u∈S∑v∈Tf(v,u)<=∑u∈S∑v∈Tf(u,v)<=∑u∈S∑v∈Tc(u,v)=c(S,T)
任意流f的流量不超过任意割的容量,即
∣
f
∣
<
=
c
(
S
,
T
)
|f|<=c(S,T)
∣f∣<=c(S,T)
最大流最小割定理:
对于一个网络
G
G
G,下面三个命题总是等价:
1、流
f
f
f 是
G
G
G 的最大流
2、当前流
f
f
f 的残留网络
G
f
G_f
Gf 上不存在增广路
3、存在某个割使得
∣
f
∣
=
c
(
S
,
T
)
|f|=c(S,T)
∣f∣=c(S,T),它即是最小割
证明自己搜一下吧,我也没太懂
Ford-Fulkerson算法:
Ford-Fulkerson (G,s,t){
for each edge (u,v) ∈ G,E
(u,v).f=0
while there exists a path p from s to t in the residual network G_f{
c_f(p)=min{c_f(u,v):(u,v) ∈ p}
for each edge (u,v) ∈ p
if (u,v) ∈ E
(u,v).f+=c_f(p)
else
(u,v).f-=c_f(p)
}
}
Edmonds-Karp算法:
在EF的基础上,将增广路的过程优化为每次寻最短增广路的过程,其中路径长度定义为从
s
s
s 到
t
t
t 需要经过的边条数
引理3:
在EK中,令
d
(
u
)
d(u)
d(u) 表示残量单位网络上从
s
s
s 到
u
u
u 的最短路距离,那么对于
V
s
V_s
Vs 中的任意
u
u
u,在每次增广后
d
(
u
)
d(u)
d(u) 不降
定理:
在EK算法中,增广的次数是
O
(
V
E
)
O(VE)
O(VE),所以复杂度为
O
(
V
E
2
)
O(VE^2)
O(VE2)
证明这里不给了
Dinic算法:
在EK的基础上,将每次寻找一条增广路优化为每次计算出一 个增广网络
在残量网络中,若两个端点间的最短路恰好差1,就称之为可行边,由所有可行边构成的图(最短路图),称为可行网络,在可行网络上的无法再扩充流量的流,称为阻塞流,注意不必是残量网络的 最大流,增广完一个阻塞流后,
d
(
t
)
d(t)
d(t)必增,因而最多增广
O
(
V
)
O(V)
O(V)次,增广单次的实现和时间复杂度:
1、一个节点的dfs至多被调用O(E)次。
2、for循环外部的时间复杂度之和为
O
(
V
E
)
O(VE)
O(VE)
3、for循环执行次数可分为只经过一次的和经过多次的
4、经过一次的复杂度之和为
O
(
E
)
O(E)
O(E)
5、经过多次的次数之和为
O
(
V
E
)
O(VE)
O(VE)。
6、因此加了左边所有优化的dinic总复杂度为
O
(
V
2
E
)
O(V^2E)
O(V2E)
(贴一下代码)
int dfs(int x,int sum)
{
if(x==t||!sum) return sum;
int res=0;
for(int i=head[p];i;i=next[i])
{
int y=ver[i];
head[x]=i;
if(d[y]==d[x]+1&&w[i])
{
int tmp=dfs(v,min(sum-res,w[i])sd);
res++tmp;
w[i]-=tmp,w[rec[i]]+=tmp;
}
if(res==sum) return res;
}
if(!res) d[x]=-1;
return res;
}
代码就是按某种顺序找增广路,一旦找到直接增广
(可以使用动态树优化找阻塞流并增广的过程,迭代次数不变,因而可以达到 O(VElogV)的复杂度)
阅读材料:
1、https://www.arl.wustl.edu/~jst/cse/542/text/sec19.pdf
2、http://courses.csail.mit.edu/6.854/16/Notes/n10-blocking_flows.html
单位容量网络指所有的存在的边容量均为1的网络
引理4:
dinic在单位容量网络中至多增广
O
(
m
i
n
(
E
1
2
,
V
2
3
)
)
O(min(E^\frac {1}{2},V^\frac {2}{3}))
O(min(E21,V32)) 次
结论3:dinic在单位容量网络中寻找阻塞流可达O(E)复杂度
因此,在单位容量网络当中,dinic的时间复杂度可达
O
(
E
m
i
n
(
E
1
2
,
V
2
3
)
)
O(Emin(E^\frac {1}{2},V^\frac {2}{3}))
O(Emin(E21,V32))
单位网络指对于
V
s
,
t
V_{s,t}
Vs,t 中的任意一节点,都满足下面两条之一
1、仅存在一条单位容量的入边
2、仅存在一条单位容量的出边
结论4:dinic在单位网络中效率可达
O
(
V
1
2
E
)
O(V^\frac {1}{2}E)
O(V21E) (跑二分图用)
例子:
最大权闭合子图(介绍略,自行再了解趴)
(证明再略,实在太多了,有空再加)
DAY6
仅自己用的链接(file:///C:/Users/Belief、御风/Desktop/19.8.2)
上午动态规划讲题
总结起来,灰常懵逼,找题目去练吧,没什么好多说的
下午树上数据结构
总结起来,还是灰常懵逼,我天这什么题有点崩溃啊。
DAY7
仅自己用的链接(file:///C:/Users/Belief、御风/Desktop/19.8.3)
数论专场
质因子分解:
素性测试:
试除法:
一种配合质数筛法可以做到
O
(
n
)
O(\sqrt n)
O(n) 的复杂度。
Miller-Rabin 素性测试:
可以做到 O(logn) 的复杂度,属于 RP 算法。
基本原理是费马小定理,于是对于某个 p,若能找到与它互质的 a 使得
a
p
−
1
≠
1
(
m
o
d
p
)
a^{p−1}\ne 1(mod p)
ap−1=1(modp),则
p
p
p 必不是质数。 然而有一些合数
p
p
p,满足所有与它互质的
a
a
a 都有
a
p
−
1
≡
1
a^{p−1}\equiv 1
ap−1≡1 (mod
p
p
p),这种数称为Carmichael 数(如 561=3∗11∗17),这样的数是用上面的方法检验不出来的。 所以还需要奇素数判定。对于奇素数
p
p
p,如果
a
p
−
1
≡
1
a^{p−1}\equiv 1
ap−1≡1 (mod
p
p
p) 即
(
a
p
−
1
2
+
1
)
(
a
p
−
1
2
−
1
)
≡
0
(a^\frac{p−1}{2}+1)(a^\frac{p−1}{2}−1)\equiv 0
(a2p−1+1)(a2p−1−1)≡0 (mod
p
p
p),由于
F
p
F_p
Fp 是整环, 所以
a
p
−
1
2
≡
1
a^\frac{p-1}{2}\equiv 1
a2p−1≡1 或
p
−
1
p−1
p−1。如果
p
−
1
2
\frac{p−1}{2}
2p−1 还是偶数则可以继续往下检验…用原根的一些理论可以证明这样就能保证对于任意合数至少 存在一个
a
a
a 可以判定它是合数。
其它还有印度人的AKS算法:
可以做到正确率 100% 的 O(logn) 复杂度。
但绝大多数情况 Miller-Rabin 都够优秀了。
质因子分解的方法:
试除法:
复杂度为
O
(
n
)
O(\sqrt n)
O(n),太慢。。。
Pollard’s Rho(又名启发式分解):
期望复杂度
O
(
n
4
l
o
g
n
)
O(\sqrt[4] nlogn)
O(4nlogn),
n
n
n 是素数的时候用Miller-Rabin素性测试,不是素数的时候,复杂度只和最小的质因子有关,所以称为启发式
假如要分解一个数
n
n
n,首先进行素性测试,是素数直接返回。 否则就要生成一些随机的
x
[
i
]
x[i]
x[i],去求
g
c
d
(
∣
x
[
i
]
−
x
[
j
]
∣
,
n
)
gcd(|x[i]−x[j]|,n)
gcd(∣x[i]−x[j]∣,n),如果它
∈
(
1
,
n
)
\in (1,n)
∈(1,n) 则找到了
n
n
n 的一个因子,递归分解。 一个挺靠谱的随机方法就是
x
←
x
2
+
c
x\larr x^2+c
x←x2+c,
c
c
c 是个随机数。 这样随机出来的
x
x
x 可能会进入循环,假如进入循环了我们还没找到因子,就重新随个
x
x
x 和
c
c
c,重新做,可以证明
x
←
x
2
+
c
x\larr x^2+c
x←x2+c,形成的一定是一个
ρ
ρ
ρ 形结构。 每次当
i
i
i 为
2
2
2 的幂次的时候就令
y
←
x
[
i
]
y\larr x[i]
y←x[i],如果某时刻
x
[
i
]
=
y
x[i]=y
x[i]=y 了则说明已经在环上绕了一圈了,这样“浪费”的步数仅仅是
O
(
环
长
)
O(环长)
O(环长) 级别的。
数论:
欧几里德算法:
若
x
∣
a
,
x
∣
b
x|a,x|b
x∣a,x∣b,则
x
∣
(
a
+
b
)
x|(a+b)
x∣(a+b),于是
g
c
d
(
a
,
b
)
=
g
c
d
(
b
,
a
gcd(a,b)=gcd(b,a
gcd(a,b)=gcd(b,a%
b
)
b)
b)
扩展欧几里德:
已知
a
,
b
a,b
a,b,求出
x
,
y
x,y
x,y 满足
a
∗
x
+
b
∗
y
=
g
c
d
(
a
,
b
)
a*x+b*y=gcd(a,b)
a∗x+b∗y=gcd(a,b),在欧几里德算法中递归地求,若已有
b
=
0
b=0
b=0,则
g
c
d
=
a
gcd=a
gcd=a,令
x
=
1
,
y
=
0
x=1,y=0
x=1,y=0,否则求出
x
′
,
y
′
x′,y′
x′,y′ 满足
b
x
′
+
(
a
−
a
/
b
∗
b
)
∗
y
′
=
g
c
d
(
b
,
a
bx′+ (a−a/b∗b)∗y′=gcd(b,a
bx′+(a−a/b∗b)∗y′=gcd(b,a%
b
)
=
g
c
d
(
a
,
b
)
b)=gcd(a,b)
b)=gcd(a,b)。 于是
a
∗
y
′
+
b
∗
(
x
′
−
a
/
b
∗
y
′
)
=
g
c
d
(
a
,
b
)
a∗y′ +b∗(x′−a/b∗y′) = gcd(a,b)
a∗y′+b∗(x′−a/b∗y′)=gcd(a,b)。
辗转相减(除)的其他用法:
只要一个环定义了带余除法,就可以在上面辗转相减(除),比如模合数的环、多项式环等等。比如求行列式模一个合数,根据行列式的性质可以把一行的倍数加到另一行上。辗转相减把其中一个位置消成0即可。比如求两个多项式的最大公约式,或者说多项式取模,可以不停地把一个的倍数加到另一个上,把其中一个多项式变成0。
类欧几里德:
s
o
l
v
e
(
n
,
A
,
B
,
C
)
=
∑
i
=
1
n
⌊
A
[
i
]
+
B
C
⌋
solve(n,A,B,C)=\sum^n_{i=1}⌊\frac{A[i]+B}{C}⌋
solve(n,A,B,C)=∑i=1n⌊CA[i]+B⌋,如果
A
>
=
C
A>=C
A>=C,
a
n
s
+
=
n
(
n
+
1
)
2
∗
(
A
/
C
)
ans+=n(n+1)^2∗(A/C)
ans+=n(n+1)2∗(A/C),然后
A
A
A%
=
C
=C
=C,如果
∣
B
∣
>
=
C
|B|>=C
∣B∣>=C,讨论下正负号算下,然后把
B
B
B 搞到
[
0
,
C
)
[0,C)
[0,C) 之间,设
m
=
⌊
A
[
n
]
+
B
C
⌋
m=⌊\frac{A[n]+B}{C}⌋
m=⌊CA[n]+B⌋,则要算
∑
i
=
1
n
∑
j
=
1
m
[
C
[
j
]
<
=
A
[
i
]
+
B
]
\sum^n_{i=1}\sum^m_{j=1}[C[j]<=A[i]+B]
∑i=1n∑j=1m[C[j]<=A[i]+B],即
n
m
−
∑
j
=
1
m
∑
i
=
1
n
[
A
[
i
]
<
=
C
[
j
]
−
B
−
1
]
nm−\sum^m_{j=1}\sum^n_{i=1}[A[i]<=C[j]−B−1]
nm−∑j=1m∑i=1n[A[i]<=C[j]−B−1],即
n
m
−
s
o
l
v
e
(
m
,
C
,
−
B
−
1
,
A
)
nm−solve(m,C,−B−1,A)
nm−solve(m,C,−B−1,A)。每次
A
A
A 对
C
C
C 取模后互换位置,复杂度同欧几里德算法,为
O
(
l
o
g
C
)
O(logC)
O(logC)
(还有些需要补的)
DAY8
仅自己用的链接(file:///C:/Users/Belief、御风/Desktop/19.8.4)
第一题有些东西没考虑写挂了,0分。
第二题准备暴力拿分,于是就把暴力分拿完了,42分。
第三题做的时候心态爆炸,然后全部输出0,于是,0分。
总的42分,感觉其实第一题还是可以拿分的,就是自己没考虑完整,emmm。另外,这果然不是闹着玩的,不小心就要爆0掉rating什么的(虽然这次没有掉),今后要加油啊!
DAY9
仅自己用的链接(file:///C:/Users/Belief、御风/Desktop/19.8.5)
T1,T2打暴力打炸,T3打表都打炸了。
于是爆零,我自闭了。。。
DAY10
仅自己用的链接(file:///C:/Users/Belief、御风/Desktop/19.8.6)
三题全部敲了暴力代码(最暴力的),然后由于最后一题特判比别人多输出了一些东西,然后,运气爆发多过了一个点,于是超了好多人。
30、20、20,但分数还是不够啊,还要继续加油呢。
DAY11
仅自己用的链接(file:///C:/Users/Belief、御风/Desktop/19.8.7)
祝各位dalao七夕快乐!!!
跑题了跑题了…
T1挺简单的,但由于我太菜了,然后写炸爆0
T2暴力20分(本来想搞搞看70分的。。。)
T3有点难,40分挺满足了。。。
所以一共60分,还是低呀,要加油呢。
DAY12
仅自己用的链接(file:///C:/Users/Belief、御风/Desktop/19.8.8)
又是愉快的看ioiDAY2直播的一天
所以还是先说考试的事吧
T1、T2都不算难,但我又写炸,对自己感到绝望。。。
T3第一次做提答题,第二个点没更新到于是少了5分,得了33分emmm…
总共63分,但我又掉rating了,诶。。。
DAY13
仅自己用的链接(file:///C:/Users/Belief、御风/Desktop/19.8.9)
莫比乌斯反演
积性函数:
对于
(
a
,
b
)
=
1
,
f
(
a
b
)
=
f
(
a
)
f
(
b
)
(a,b)=1,f(ab)=f(a)f(b)
(a,b)=1,f(ab)=f(a)f(b),那么
f
(
x
)
f(x)
f(x) 为积性函数,欧拉函数就是积性函数,另外还有
d
(
x
)
=
∑
a
∣
x
1
,
σ
(
x
)
=
∑
a
∣
x
a
,
i
d
(
x
)
=
x
,
l
(
x
)
=
1
,
e
(
x
)
=
1
=
>
x
=
1
d(x)=\sum_{a|x} 1 , σ(x)=\sum_{a|x} a , id(x)=x , l(x)=1 , e(x)=1 => x=1
d(x)=∑a∣x1,σ(x)=∑a∣xa,id(x)=x,l(x)=1,e(x)=1=>x=1
狄利克雷卷积:
两个数论函数
f
(
x
)
,
g
(
x
)
f(x),g(x)
f(x),g(x),令
h
=
f
∗
g
h=f*g
h=f∗g,那么
h
(
x
)
=
∑
a
∣
x
f
(
a
)
g
(
x
a
)
h(x)=\sum_{a|x} f(a)g(\frac{x}{a})
h(x)=∑a∣xf(a)g(ax),易证满足交换律和结合律,两积性函数的卷积还是积性函数,
f
∗
e
=
f
f*e=f
f∗e=f,注意,卷积不一定要求两个函数都是积性函数
莫比乌斯函数:
如果
F
(
n
)
=
∑
d
∣
n
f
(
n
)
F(n)=\sum_{d|n} f(n)
F(n)=∑d∣nf(n),那么
f
(
n
)
∑
d
∣
n
µ
(
d
)
∗
F
(
n
d
)
f(n)\sum_{d|n} µ(d)*F(\frac{n}{d})
f(n)∑d∣nµ(d)∗F(dn),
F
=
f
∗
l
=
>
F
∗
µ
=
(
f
∗
l
)
∗
µ
=
f
∗
(
l
∗
µ
)
=
f
∗
e
=
f
F=f*l=>F*µ=(f*l)*µ=f*(l*µ)=f*e=f
F=f∗l=>F∗µ=(f∗l)∗µ=f∗(l∗µ)=f∗e=f,不要求
f
f
f 为积性函数
筛法:
时间复杂度为
O
(
n
∗
l
o
g
(
l
o
g
(
n
)
)
)
O(n*log(log(n)))
O(n∗log(log(n)))
线性筛法:
void xxsf(){
v[1]=1;
p[1]=1;
for(int i=1;i<=n;++i){
if(!p[i]){
p[i]=i;
s[++ans]=i;
v[i]=-1;
}
for(int j=1;j<=ans&&s[j*i]<=n;++j){
p[s[j]*i]=s[j];
if(p[i]==s[j]) break;
else v[s[j]*i]=-v[i];
}
}
思想是保证每个合数只被他最小的素因子访问到,时间复杂度为 O ( n ) O(n) O(n),但自带大常数,可以求出一个积性函数的值
另外的不多说了,看pdf。
下午的时候听了一下模拟赛的讲解
感觉还好。
DAY14
仅自己用的链接(file:///C:/Users/Belief、御风/Desktop/19.8.10)
t1暴力写炸
t2打表过了40分
t3根本不会
然后只有40分,感觉真的太菜了啊,被人家完虐啊。。。
DAY15
仅自己用的链接(file:///C:/Users/Belief、御风/Desktop/19.8.11)
t1纯暴力10分
t2不会
t3没时间看
总计10分,我我我又被完虐了。。。
DAY16
仅自己用的链接(file:///C:/Users/Belief、御风/Desktop/19.8.12)
我自闭了,所以去c班听dp。。。
斯特林数:
第一类:
n
n
n 个数的排列中有
k
k
k 个“环”的方案数,
n
n
n 个人分配到
k
k
k 个圆桌上,圆桌旋转相等的方案数,即只关心每个人左边的人是谁,
s
(
n
,
k
)
=
s
(
n
−
1
,
k
−
1
)
+
(
n
−
1
)
∗
s
(
n
−
1
,
k
)
s(n,k)=s(n-1,k-1)+(n-1)*s(n-1,k)
s(n,k)=s(n−1,k−1)+(n−1)∗s(n−1,k)
第二类:
n
n
n 个数分成
k
k
k 个集合的方案数,集合不可区分,
s
(
n
−
k
)
=
s
(
n
−
1
,
k
−
1
)
+
k
∗
s
(
n
−
1
,
k
)
s(n-k)=s(n-1,k-1)+k*s(n-1,k)
s(n−k)=s(n−1,k−1)+k∗s(n−1,k)
欧拉数:
n
n
n 个数的排列,其中有
k
k
k 个满足
p
[
i
]
<
p
[
i
+
1
]
p[i]<p[i+1]
p[i]<p[i+1] 的排列个数,
e
(
n
,
k
)
=
(
k
+
1
)
+
e
(
n
−
1
,
k
)
+
(
n
−
k
)
∗
e
(
n
−
1
,
k
−
1
)
e(n,k)=(k+1)+e(n-1,k)+(n-k)*e(n-1,k-1)
e(n,k)=(k+1)+e(n−1,k)+(n−k)∗e(n−1,k−1)
数位dp:
对十进制数或二进制数的某个统计,可能需要记录当前在第几位,上一个数字是什么,和题目有关的一些信息,当前位是否和限制相等,如果是多个整数,可能需要记录进位,错位等,当然还要注意前导零的问题
DAY17
仅自己用的链接(file:///C:/Users/Belief、御风/Desktop/19.8.13)
t1思考了一会,把特判全弄出来了,然后100分
t2调了好久还是炸了,0分
t3没时间写了,只敲了一个基本暴力,20分
总计120分,没有到预期成绩,策略不行啊。。。
下午有点懵逼。。。
DAY18
仅自己用的链接(file:///C:/Users/Belief、御风/Desktop/19.8.14)
背包dp:
n
n
n 个物品,每个物品有重量
w
[
i
]
w[i]
w[i],求选出重量和不超过
s
s
s 物品集合的方案数,经典的有01背包(每个物品最多选一次),无限背包(每个物品可以选无数次),多重背包(每个物品最多选
k
[
i
]
k[i]
k[i] 个),进阶问题看pdf吧
树形dp:
求直径,求每个点到其他点的距离之和,求每个点到其他点的最长路径,求树上一个点权和最大的独立集,求树上有几个大小不超过
k
k
k 的独立集
区间dp:
看一下pdf就好吗,全是经典题目
状压dp:
同上吧。。。
另外一些奇怪的、比较难的题目自己搜一下吧
DAY19
仅自己用的链接(file:///C:/Users/Belief、御风/Desktop/19.8.15)
向我们传授了一下经验。
感觉这几天效果挺不错的,但还有很多坑,还要好好消化。
好好吸收经验,今后要加油哦!
结束了呢。。。