数论
- 线性筛素数、欧拉函数
- 质因数分解
- 最大公约数&最小公倍数
- 扩展欧几里得算法
- 线性同余方程+中国剩余定理
- 矩阵乘法
- 高斯消元
- 组合计数
- 容斥原理
- 概率&数学期望
- 0/1分数规划
质因数分解:
N的正约数的和为:
(
1
+
p
1
+
p
1
2
+
p
1
3
+
.
.
.
+
p
1
c
1
)
∗
.
.
.
∗
(
1
+
p
m
+
p
m
2
+
p
m
3
+
.
.
.
+
p
m
c
m
)
(1+p_1+p_1^2+p_1^3+...+p_1^{c_1})*...*(1+p_m+p_m^2+p_m^3+...+p_m^{c_m})
(1+p1+p12+p13+...+p1c1)∗...∗(1+pm+pm2+pm3+...+pmcm)
欧拉定理的推论:
许多计数类问题要求我们把答案对一个质数p取模后输出。
面对a+b,a-b,a*b,直接在计算前对p取模
a/b,则直接变化做
a
∗
1
b
a*\frac{1}{b}
a∗b1,对b求逆元
a
b
a^b
ab,则先把底数对p取模,再把指数对
φ
(
p
)
φ(p)
φ(p)取模(前提:gcd(a,p)=1)
**若gcd(a,p)!=1,则
b
m
o
d
φ
(
n
)
+
φ
(
n
)
b\mod φ(n)+φ(n)
bmodφ(n)+φ(n)
存在逆元的条件:
g
c
d
(
x
,
p
)
=
=
1
gcd(x,p)==1
gcd(x,p)==1
特别地,当P为质数的时候,x不能是P的倍数
例题SumdivPOJ 1845
异或的性质:
如果a^b^c=e
则有 a=e^b^c
这样用高斯消元解异或方程组的时候就很妙了
组合计数:
常用性质
图论
- 最短路(Dijkstra,SPFA,Floyd)
- 最小生成树
- 树上操作(树的直径、LCA)
- 基环树
- 负环+差分约束
- Tarjan
- 欧拉路
- 2-SAT
- 二分图匹配
- 网络流
最短路
- 最短路计数【√】
- 次短路【√】
- K短路【√】
- 传递闭包【√】
- 最小环【√】
无向图の最小环:核心代码
for(re int k=1;k<=n;++k){
for(re int i=1;i<k;++i)
for(re int j=i+1;j<k;++j){
if(ans>dis[i][j]+a[i][k]+a[k][j])
ans=dis[i][j]+a[i][k]+a[k][j];
}
for(re int i=1;i<=n;++i)
for(re int j=1;j<=n;++j){
ll tmp=dis[i][k]+dis[k][j];
if(tmp<dis[i][j]){
dis[i][j]=tmp;
pos[i][j]=k;
}
}
}
Floyd这个乱搞求最短路!!根本无法求次短路好伐。所以自己yy的那个做法是不可以的,但正确性应该是可以保证的
有向图の最小环:可以枚举起点s,然后求单源最短路径。s一定是最先从堆中取出来的,扫描s的出边进行扩展,然后将
d
i
s
[
s
]
=
i
n
f
dis[s]=inf
dis[s]=inf,继续扩展。当s第二次从堆中取出来的时候,答案就是
d
i
s
[
s
]
dis[s]
dis[s]
最短路计数:果然不能轻视模板啊!!打挂n次。
第一次发现dij板子打错,粗心忘了标记vis(一般是不会有太大问题的,但是恰恰是计数,问题就很大了)
第二次发现cnt记错了,应该对于每个点都记录一下,而不能所有点的答案累加(oh,such a crazy girl)
第三次发现题目有重边
第四次发现这居然是个有向图(我要死了)
次短路:
最小生成树
- 最小生成树计数【√】
- 次小生成树【√】
可能还需要复习博弈论,分块