算法板子[updating]
4FGR板子
数据结构
单调栈/队列
并查集
ST表
线段树
珂朵莉树
图论
存储
链式前向星
vec型
1 2 3 4 5 6 7
| vector<int> nxt,head,to;
void add(int u,int v){ nxt.push_back(head[u]); head[u] = to.size(); to.push_back(v); }
|
数组型
1 2 3 4 5 6 7 8
| const int N=1e5; int nxt[N],head[N],to[N]; int cnt = 0; void add(int u,int v){ nst[++cnt] = head[u]; head[u] = cnt; to[cnt] = v; }
|
判断二分图
数学
高精度
快速幂
若无需模,请无视 \(p\)
1 2 3 4 5 6 7 8 9
| int qpow(int a,int b,int p){ int res = 1; while(b){ if(b&1) res = res*a %p; a = a*a %p; b >>= 1; } return res; }
|
分解质因数
朴素做法
1 2 3 4 5 6 7 8 9 10 11
| vector<int> breakdown(int n){ vector<int> res; for(int i=2;i*i<=n;i++){ while(n%i==0){ n/=i; res.push_back(i); } } if(n!=1) res.push_back(n); return res; }
|
线性筛
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| vector<bool> isPrime; vector<int> prime; int n,q; void seive(){ isPrime.assign(n+1,true); for(int i=2;i<=n;i++){ if(isPrime[i]){ prime.push_back(i); } for(auto j:prime){ if(i*j > n) break; isPrime[i*j] = false; if(i % j == 0) break; } } }
|
欧拉函数
模逆元
当模数是素数 \(p\) 时
单个乘法逆元使用快速幂 \(qpow(a,p-2,p)\) 即可 ( \(a^{p-1} \equiv1 \pmod p\))