并查集
- 用途:找图的回路
- Arrays.fill(dset,-1)
- 合并树根,原图的关联丢失
dset:[n] @fill(-1)
roota=root(a)
rootb=root(b)
if(a!=b)
dset[b] = a //合并
else
... //节点在相同集合时
root(l) =>
while(dset[l]!=-1)
l = dset[l]
return l
费马小定理
a * a(-1)=1(%mod)
a(-1)=a(mod-2)%mod
年份
闰年判断条件
isLeap(y) =>
(y % 4 == 0 && y % 100 != 0) || y % 400 == 0
质数
- 互质的两个数最大凑不出的数为a * b - (a + b),个数为(a - 1) * (b - 1) / 2。
全排列
a:[len]
f(k) =>
if(k==len) ...;return; //check
for(i=k;i<len;i++)
t=a[i];a[i]=a[k];a[k]=t; //swap
f(k+1)
t=a[i];a[i]=a[k];a[k]=t; //reswap
f(0)
抓取法(无重复组合)
a:[len] @sorted
path:[len]
vis:bool[len]
f(k) =>
if(k==len) ...;return; //check path
for(i=0;i<len;i++)
if(i>0 && a[i] == a[i-1] && !vis[i-1])
continue
if(!vis[i]) //没有用过的元素可以抓入path
vis[i] = true
path[k] = a[i] //catch
f(k+1)
vis[i] = false
f(0)
- 当前元素和上一元素相同 且 上一元素未被抓取 则跳过。
DFS
- 提前剪枝
快速幂
pow(a, n) =>
if(a == 0) return 0
ans = 1
while(n > 0)
if((n & 1) == 1)
ans = ans * x % MOD
n >>= 1
a = a * a % MOD
return ans
拓扑排序
拓扑图,无向图就add两遍。
n //节点个数
idx //边的id
e:int[n*2] //edge
h:int[n] @fill(-1) //head
ne:int[n*2] //next edge
d:int[n] //节点的入度
add(a, b) =>
e[idx] = b
ne[idx] = h[a]
h[a] = idx++
d[a]++
遍历所有a指向的节点
for(i = h[a]; i != -1; i = ne[i])
t = e[i]
...