08 2024 档案

摘要:线性基 1、三大性质: 原序列里面的任意一个数都可以由线性基里面的一些数异或所得到 线性基里面的任意一些数异或起来都不可能得到 \(0\) 线性基里面的数的个数唯一,并且在保持性质一的前提下,数的个数是最少的 2、构造 \(p\) 数组:每次我们插入一个数 \(x\) 时,如果 \(x\) 二进制的 阅读全文
posted @ 2024-08-31 22:06 grape_king 阅读(24) 评论(0) 推荐(1)
摘要:区间的与运算和区间的或运算 1、可以求解 \(l\&(l+1)...\&r\) 或者 \(l|(l+1)...|r\) 的值,\(1\le l\le r\le 1e18\)。 2、时间复杂度 \(logn\) 的级别。 struct Or_And{ i64 c; i64 f[65][65][2]; 阅读全文
posted @ 2024-08-31 17:57 grape_king 阅读(27) 评论(0) 推荐(1)
摘要:一、降序遍历 \(m\) 的非空子集: for (int s = m; s; s = (s - 1) & m); 二、降序遍历 \(m\) 的子集: for (int s = m; ; s = (s - 1) & m) { // if (s == 0) break; } 阅读全文
posted @ 2024-08-31 17:54 grape_king 阅读(22) 评论(0) 推荐(1)
摘要:一、欧几里得算法 i64 gcd(i64 a, i64 b) { return b == 0LL ? a : gcd(b, a % b); } 二、更相相减法 i64 gcd(i64 a, i64 b) { if (a == 0) return a; if (b == 0) return b; i6 阅读全文
posted @ 2024-08-31 17:52 grape_king 阅读(23) 评论(0) 推荐(1)
摘要:普通版本的质因数分解:时间复杂度为 \(O(\sqrt{n})\),可以处理 \(n=1e10\)。 struct Avg{ i64 N; vector<i64> preim; vector<i64> cnt; Avg(i64 N_) { N = N_; for (i64 i = 2; i <= N 阅读全文
posted @ 2024-08-31 17:51 grape_king 阅读(146) 评论(0) 推荐(1)
摘要:线性同余方程 定义:形如 \(ax \equiv b \ (mod \ p)\) 的方程,其中 \(a,b,n\) 我给定的整数,\(x\) 为未知数,从区间 \([0,n-1]\) 求解 \(x\),当解不唯一时求出所有解。 用逆元求解 如果 \(gcd(a,p)=1\),则 \(x \equiv 阅读全文
posted @ 2024-08-31 17:46 grape_king 阅读(96) 评论(0) 推荐(1)
摘要:一、威尔逊定理 1、定义:对于所有的素数都有:\((p-1)! \ \equiv \ (-1) \ (mod \ p) \ \equiv \ (p-1) \ (mod \ p)\) 。 2、应用: 我们令 \(f(n,p)=(n!)_{p}\) 为所有小于等于 \(n\) 但不能被 \(p\) 整除 阅读全文
posted @ 2024-08-31 17:03 grape_king 阅读(68) 评论(0) 推荐(1)
摘要:一、数论分块 1、可以用于求形如:\(\sum_{i=1}^{n}f(i)g(\left \lfloor \frac{n}{i} \right \rfloor)\) 的和式,时间复杂度为:\(O(\sqrt{n})\) 。 2、引理: \(\forall a,b,c \in Z, \left \lf 阅读全文
posted @ 2024-08-30 22:34 grape_king 阅读(22) 评论(0) 推荐(1)
摘要:一、裴蜀定理 1、定义:设 \(a,b\) 是不全为零的整数,对于任意整数 \(x,y\),满足 \(gcd(a,b) \ | \ ax+by\),且存在整数 \(x,y\),使得 \(ax+by=gcd(a,b)\) 。 2、推广:设 \(a,b\) 是不全为零的整数,若 \(d > 0\) 是 阅读全文
posted @ 2024-08-30 22:34 grape_king 阅读(41) 评论(0) 推荐(1)
摘要:介绍 1、素数计算函数:令小于等于 \(x\) 的素数个数为函数 \(pi(x)\),则随着 \(x\) 的增大,\(pi(x)\) 趋近于 \(\frac{x}{lnx}\)。 素数判断 1、埃氏筛:\(O(sqrt(n))\) inline bool ispreim(i64 x) { if (x 阅读全文
posted @ 2024-08-30 22:33 grape_king 阅读(143) 评论(0) 推荐(1)
摘要:欧拉函数 1、定义:用 \(\varphi (n)\) 表示的是小于等于 \(n\) 和 \(n\) 互质的个数,比如说 \(\varphi(1) = 1、\varphi(2)=1\),当 \(n\) 为质数时,很显然 \(\varphi(n)=n-1\)。 2、性质: 欧拉函数是积性函数,即对于所 阅读全文
posted @ 2024-08-30 21:13 grape_king 阅读(128) 评论(0) 推荐(1)
摘要:扩展欧几里得求逆元 1、时间复杂度:\(O(logn)\) 2、推理: \(ax \equiv g \ (mod \ p)\),所以可以转化为:\(ax+py=g\) 。 又因为由 \(exgcd\) 求出来的 \(d\) 为 \(gcd(a,b)\),所以得满足 \(d \ | \ g\) ,才能 阅读全文
posted @ 2024-08-30 11:14 grape_king 阅读(55) 评论(0) 推荐(1)
摘要:对于所有的函数我们都令 \(p\) 表示 \(x\) 的最小质因子。 求解因子数函数 \(d(x)\),可以发现如果 \(\frac{x}{p}\%p\ne 0\),那么 \(d(x)=d(\frac{x}{p})d(p)\),否则 \(d(x)=2d(\frac{x}{p})-d(\frac{x} 阅读全文
posted @ 2024-08-29 23:47 grape_king 阅读(19) 评论(0) 推荐(1)
摘要:扩展欧拉定理 1、定义:若 \(gcd(a,p)=1\),则 \(a^{\varphi(p)} \equiv 1 \ (mod \ p)\)。 2、扩展欧拉定理求模: \(\left\{\begin{array}{l} a^{b \ mod \ \varphi(p)}, \qquad \qquad 阅读全文
posted @ 2024-08-29 23:45 grape_king 阅读(28) 评论(0) 推荐(1)
摘要:莫比乌斯 1、莫比乌斯函数:\(u(n)=\left\{\begin{array}{l} 1\qquad \qquad n=1 \\ 0\qquad \qquad n含有平方因子 \\ (-1)^{k} \qquad n里面所包含质因子数目 \end{array}\right.\)。 2、令 \(\ 阅读全文
posted @ 2024-08-29 23:40 grape_king 阅读(60) 评论(0) 推荐(1)
摘要:杜教筛 1、非线性时间复杂度:比线性时间更快,杜教筛的时间复杂度差不多为 \(n^{\frac{2}{3}}\),杜教筛用于计算一类数论函数的前缀和,例如 \(S(n)=\sum_{i=1}^{n}f(i)\) 。 2、现在我们构造一个 \(S(n)\) 关于 \(S(\left \lfloor \ 阅读全文
posted @ 2024-08-29 23:30 grape_king 阅读(38) 评论(0) 推荐(1)
摘要:卷积的性质: 交换律:\(f * g=g * f\) 。 结合律:\((f * g) * h=f * (g * h)\) 。 分配律:\((f + g) * h=f * h+g * h\) 。 等式的性质:\(f=g\) 的充要条件是 \(f*h=g*h\),其中数论函数 \(h(x)\) 要满足 阅读全文
posted @ 2024-08-29 23:17 grape_king 阅读(44) 评论(0) 推荐(1)
摘要:哥德巴赫猜想 任一大于5的整数都可写成三个质数之和。 \(n > 5\): 当n为偶数,\(n=2+(n-2)\),\(n-2\) 也是偶数,可以分解为两个质数的和; 当n为奇数,\(n=3+(n-3)\),\(n-3\) 也是偶数,可以分解为两个质数的和。 任一大于 \(2\) 的偶数都可写成两个 阅读全文
posted @ 2024-08-29 23:17 grape_king 阅读(55) 评论(0) 推荐(1)
摘要:\(Tarjan\) 缩点 有向图缩点 struct SCC { int n, m; vector<int> head, from, to, nxt; vector<int> weight; int totEdge = 1; void add(int x, int y, int z = 0) { + 阅读全文
posted @ 2024-08-29 18:14 grape_king 阅读(20) 评论(0) 推荐(0)
摘要:基环树 阅读全文
posted @ 2024-08-29 18:11 grape_king 阅读(5) 评论(0) 推荐(0)
摘要:重构树 阅读全文
posted @ 2024-08-29 18:11 grape_king 阅读(9) 评论(0) 推荐(0)
摘要:\(kruskal\) 算法 struct Kruskal{ struct node{ int u, v; i64 w; bool operator<(const node &t) const { return w < t.w; } }; int n, m, cnt; i64 ans; vector 阅读全文
posted @ 2024-08-29 18:11 grape_king 阅读(23) 评论(0) 推荐(0)
摘要:树链剖分(树上点权问题) 1、树链剖分之树上线段树:求解路径值,路径大小,路径 \(rmq\),等等 \(...\) (求路径点权之和)。 2、时间复杂度:\(O(nlog^{2}n)\),空间复杂度:\(O(nlogn)\)。 3、模版:洛谷P3384,提升:洛谷P10799。 template< 阅读全文
posted @ 2024-08-29 14:02 grape_king 阅读(22) 评论(0) 推荐(0)
摘要:虚树 1、虚树是将一个树的点集的某一个子集,以及该子集中点的 \(LCA\) 的集合,一起所重构出来的一棵树。和\(targen\) 一样都是缩点。 2、用到的方法是二次排序以及 + \(lca\) 连边,排序主要是根据遍历时的 \(dfs\) 序来排列的,小的排前面。 3、时间复杂度:\(O(nl 阅读全文
posted @ 2024-08-29 13:47 grape_king 阅读(23) 评论(0) 推荐(0)
摘要:树上启发式合并 1、给一棵根为 \(1\) 的树,每次询问子树颜色种类数。 2、模版:洛谷U41492。 3、时间复杂度:\(O(nlogn)\),空间复杂度:\(O(n+m)\)。 4、启发式合并主要依靠的是灵活的树的 \(dfs\) 遍历,是利用重儿子的子树大小 \(\ge \frac{n}{2 阅读全文
posted @ 2024-08-29 11:14 grape_king 阅读(26) 评论(0) 推荐(1)
摘要:点分治 1、通过重儿子这个特性,每次遍历重儿子,每次找到的重儿子都能将重儿子的每个子节点的子树都几乎平均分割为 \(log\) 大小,所以最多 \(log\) 层,每层差不多 \(n\) 个节点,最终时间复杂度就为 \(nlogn\)。 2、可以用于解决两点之间的距离为 \(k\) 的数目有多少等等 阅读全文
posted @ 2024-08-29 09:19 grape_king 阅读(29) 评论(0) 推荐(1)
摘要:倍增法 1、通过一个倍增数组来向根节点预处理出以每个顶点不同深度的值,然后在通过两点之间的深度差值化为等深度,最后得到最近公共祖先的节点,也可得到两点的最短路径值。 2、时间复杂度:\(O(nlogn)\),空间复杂度:\(O(nlogn)\)。 3、模版:洛谷P3379。 4、倍增算法求 \(lc 阅读全文
posted @ 2024-08-28 18:44 grape_king 阅读(25) 评论(0) 推荐(1)
摘要:树的直径 1、两种方法解决:一种是通过两次 \(dfs\) 遍历得到最大直径,一种是通过树形 \(dp\) 求出每个节点中子树节点到此节点的最大距离和次大距离。 2、两种时间复杂度都是 \(O(n)\),空间复杂度也都是 \(O(n)\)。 3、但是前者方法只能处理非负边权或非负点权的直径,对于有负 阅读全文
posted @ 2024-08-27 10:02 grape_king 阅读(73) 评论(0) 推荐(1)
摘要:扫描线 阅读全文
posted @ 2024-08-27 09:09 grape_king 阅读(4) 评论(0) 推荐(1)
摘要:注:我们这里定义 \(mof=0x3f3f3f3f\),\(MOF=0x3f3f3f3f3f3f3f3f\),表示最短路径的无穷大,\(|V|\) 表示图中顶点数,\(|E|\) 表示图中边数。 \(Dijkstra\) 算法 1、原方法时间复杂度是 \(O(|V|^2)\) 的,是直接用 \(qu 阅读全文
posted @ 2024-08-27 09:09 grape_king 阅读(40) 评论(0) 推荐(1)
摘要:权值线段树 1、一种可以处理整个数组的第 \(k\) 大数或第 \(k\) 小数的算法,依名可知,该线段树是由数值来建线段树的,如果对于权值为 \(1e9\) 这样的数据,我们也可以通过离散化的方式进行值域压缩,从而缩小到 \(2e5\) 的样子,和普通线段树一样,可以通过懒标记来维护一段区间的修改 阅读全文
posted @ 2024-08-15 02:42 grape_king 阅读(28) 评论(0) 推荐(1)
摘要:李超线段树 性质:李超线段树一般支持具有单调性的函数,如一次函数。 1、李超求该位置包含的所有函数的 \(min\): template<typename T> struct LC_tree{ T eps = 1e-15; struct line{ T k, b; line(T k = 0.0, T 阅读全文
posted @ 2024-08-15 02:42 grape_king 阅读(18) 评论(0) 推荐(1)
摘要:动态开点线段树 1、与普通线段树相比,优点在于对于 \(1e8-1e18\) 以内的权值维护不需要进行离散化,可直接进行动态开点维护,更加方便,但是这样会比原来线段树维护的空间复杂度来得高,空间复杂度更差一些。 2、如图说明动态开点过程: 可以发现我们不需要用到区间 \([6,6]\) 的两个子节点 阅读全文
posted @ 2024-08-15 02:41 grape_king 阅读(36) 评论(0) 推荐(1)
摘要:划分树 1、和主席树差不多的用法,只不过常数比主席树小。 2、可用于求解静态区间第 \(k\) 小问题。 3、时间复杂度:\(O(nlogn)\),空间复杂度:\(o(nlogn)\),所以划分树是一个非常优的算法。 4、模版:洛谷P3834。 template<typename T> struct 阅读全文
posted @ 2024-08-15 02:40 grape_king 阅读(15) 评论(0) 推荐(1)
摘要:平衡树 1、可以维护一个数在数组中的排名,排名为 \(x\) 的数,一个数的前驱和后驱。 2、模版:洛谷P8747 和 洛谷P6136。 3、查询和修改的时间复杂度:\(O(logn)\)。 template<typename T> struct Splay{ struct node{ int fa 阅读全文
posted @ 2024-08-15 02:38 grape_king 阅读(18) 评论(0) 推荐(1)
摘要:笛卡尔树: 1、性质: 具有键值 \((k, w)\),且 \(k\) 为下标,\(w\) 满足小根堆性质。 具有小根堆性质,任意一个节点的子树节点数值都比其来得大,每个节点与其子树中的所有节点连起来是一段连续区间。 2、用途:可以用它来计算一个数组中子矩阵的最大值。 3、如图: template< 阅读全文
posted @ 2024-08-15 02:32 grape_king 阅读(25) 评论(0) 推荐(1)
摘要:归并排序 1、二分归并排序可以算出一个数组中的逆序对数目,因为本身这个算法利用的就是分治算法,所以可以在 \(nlogn\) 的时间复杂度里面求出所有逆序对数目。 2、另外我还拓展了一些三分归并、四分归并...等等,目前没发现有啥用途,然后我又写了个代码,支持最多 \(31\) 分归并排序,通过这个 阅读全文
posted @ 2024-08-15 02:17 grape_king 阅读(20) 评论(0) 推荐(1)
摘要:字典树 1、用途:用于处理一些字符串匹配,或任意两数异或最大值,等等... 1、模版:洛谷P8306。 template<typename T> struct Z_tree{ int n, tot; vector<T> cnt; vector<array<int, 2>> tree; Z_tree( 阅读全文
posted @ 2024-08-15 02:10 grape_king 阅读(17) 评论(0) 推荐(1)
摘要:线段树 1、定义:线段树是一种相对实用的算法,可以处理好多东西,有时候对于区间修改,可以通过懒标记法来维护一些更加复杂的问题。 (1)线段树模版: template<typename T> struct X_tree{ struct Segtree{ T siz, l, r; Segtree(T s 阅读全文
posted @ 2024-08-15 02:04 grape_king 阅读(37) 评论(0) 推荐(1)
摘要:\(ST\) 表 1、定义与用途:一种用于快速查询区间 \(max,min,or,and,gcd\) 等等的算法,查询时间为 \(O(1)\),不过需要预处理,预处理时间为 \(nlogn\),且不支持区间修改和单点修改。 2、理解:\(ST\) 表主要是利用倍增数组来实现的,对于求解那些区间里面的 阅读全文
posted @ 2024-08-15 01:55 grape_king 阅读(49) 评论(0) 推荐(1)
摘要:注:树状数组中 \(lowbit\) 函数代表的是这个数所维护的区间长度。 树状数组(单点查询、区间修改) 1、时间复杂度为 add:\(O(log\ n)\),query:\(O(log\ n)\)。 2、模版:洛谷P3368。 template<typename T> struct Fenwic 阅读全文
posted @ 2024-08-13 22:14 grape_king 阅读(55) 评论(1) 推荐(1)
摘要:莫队 1、时间复杂度为 \(O(n\sqrt n)\),用于离线处理一些操作的答案。 template<typename T> struct Md{ struct Q { int L; int R; int num; }; int n, m, k, len, l, r; T res; vector< 阅读全文
posted @ 2024-08-12 20:33 grape_king 阅读(38) 评论(2) 推荐(1)
摘要:不带权并查集 1、时间复杂度为 \(O(n)\) 。 struct DSU{ int n, cnt; vector<int> fa, siz; DSU() {} DSU(int n_) : fa(n_ + 1), siz(n_ + 1, 1) { n = n_; cnt = n; iota(fa.b 阅读全文
posted @ 2024-08-12 20:22 grape_king 阅读(38) 评论(1) 推荐(1)