随笔分类 - 算法·理论
欧拉回路
摘要:var code = "283645f8-4b3e-4b22-b592-8b24b592589c" 有向图欧拉回路 Hierholzer 在每次递归过程中先遍历完所有边再将自己入栈,得到逆序欧拉回路。相当于把多条欧拉回路插入到主回路中。 void dfs(int x){ for(;head[x];)
点分树
摘要:变量 int rt\texttt{int rt}int rt:重心。 int fat[x]\texttt{int fat[x]}int fat[x]:点 xxx 在点分树上的父亲。 int sz[x]\texttt{int sz[x]}int sz[x]:点 xxx 的子树大小。 int mx[x]
后缀树
摘要:变量 int tot\texttt{int tot}int tot:节点个数。 int tpos\texttt{int tpos}int tpos:字符个数。 int now\texttt{int now}int now:现在走到了哪个点。 int rem\texttt{int rem}int re
龟速乘
摘要:普通版本 求 a×b mod ca\times b\bmod ca×bmodc,时间复杂度 O(logb)O(\log b)O(logb)。 乘法可能爆 long long\text{long long}long long 时可以用。 long long Fmul(long long a,long
常用程序模板
摘要:#include<bits/stdc++.h> #define ll long long using namespace std; long long read(){ long long x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-
离散化
摘要:把长度为 nnn 的 aaa 数组映射成只有 1∼tot1\sim tot1∼tot 的整数的 bbb 数组,其中返回值 tottottot 是 aaa 中元素个数。 int discrete(int n,int *a){ int b[N]; for(int i=1;i<=n;i++) b[i]=a
重载运算符
摘要:结构体内 struct asdf{ int x, y; bool operator<(const asdf &a)const{ return x<a.x||(x==a.x&&y<a.y); } }; 结构体外 bool operator<(const int &a,const int &b){ re
同余
摘要:扩展欧几里得算法 扩展欧几里得算法,也叫 exgcd\text{exgcd}exgcd。 时间复杂度为 O(log(a+b))O(\log(a+b))O(log(a+b))。 long long exgcd(long long a,long long b,long long &x,long lon
约数
摘要:正约数集合 试除法 求出 NNN 的正约数集合。 O(N)O(\sqrt N)O(N)。 int m; int factor[1600]; void q_factor(int n){ for (int i=1;i*i<=n;i++){ m=0; if(n%i==0){ factor[++m]=i;
质数
摘要:质数的判定 暴力判定 O(N)O(\sqrt N)O(N)。 bool is_prime(ll n){ if(n<2) return 0; ll k=sqrt(n); for(ll i=2;i<=k;i++) if(n%i==0) return 0; return 1; } 随机化 O(klog
矩阵
摘要:矩阵结构体 变量 a[N][N]:表示矩阵。其中 NNN 为自定义常数。 h:行数。 l:列数。 函数 clean():把结构体初始化。 build():把结构体改成单位矩阵。若单位矩阵乘以某个 SSS,结果就是 SSS。 K_Recursion(k,*b):构造 kkk 阶常系数线性递推项,bbb
高精度
摘要:头文件 此模板涉及的头文件较多,建议用 <bits/stdc++.h> 库。 强制转换 此模板支持两种转换: 整型 ⇒BigInteger\Rightarrow\text{BigInteger}⇒BigInteger:BigInteger(n),其中 nnn 是整型。 字符串型 ⇒BigIntege
快速幂
摘要:ab mod ca^b\bmod cabmodc。 把 bbb 分解成二进制数,递推求解。 long long qmi(long long a,long long b,long long c){ long long ans=1; while(b){ if(b&1) ans=ans*a%c; a=a*
快读快写
摘要:long long read(){ long long x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();} while(isdigit(ch)){x=x*10+ch-48;ch=getchar(