From a09e559bf62a3b568c236a86dddfcccf8fb55600 Mon Sep 17 00:00:00 2001 From: Tifa <62847935+Tiphereth-A@users.noreply.github.com> Date: Fri, 29 Dec 2023 14:46:39 +0800 Subject: [PATCH] fix: upload --- .latexindent.yaml | 1 + config.yml | 15 +- manager.py | 11 +- src/cheatsheet/formula.tex | 2 +- src/cheatsheet/nt-const.tex | 2 +- src/cheatsheet/oeis-seq.tex | 324 +++++++++++++------------- src/cheatsheet/seqences.tex | 8 +- src/code/opt/simplex.hpp | 4 +- src/code/str/suffix_automaton.hpp | 26 +-- src/doc_tex/conv/karatsuba.tex | 2 +- src/doc_tex/ds/link_cut_tree.tex | 10 +- src/doc_tex/ds/segtree.tex | 12 +- src/doc_tex/fast/rsort32.tex | 3 - src/doc_tex/fast/str2uint_mod.tex | 3 - src/doc_tex/fast/str2uint_si64.tex | 4 - src/doc_tex/fast/strhex2uint_si64.tex | 4 - src/doc_tex/fast/u32tostr.tex | 7 +- src/doc_tex/fast/u32tostrhex.tex | 7 +- src/doc_tex/geo2d/triangle.tex | 4 +- src/doc_tex/math/berlekamp_massey.tex | 4 +- src/doc_tex/math/cantor.tex | 14 +- src/doc_tex/math/exeuclid.tex | 20 +- src/doc_tex/math/proot_gint.tex | 2 +- src/doc_tex/math/qtetra_mod.tex | 8 + src/doc_tex/opt/alpha_beta.tex | 7 +- src/doc_tex/opt/simplex.tex | 34 +-- src/doc_tex/str/lyndon.tex | 7 +- src/doc_tex/str/suffix_automaton.tex | 39 ++-- src/doc_tex/util/hash_splitmix64.tex | 2 +- 29 files changed, 292 insertions(+), 294 deletions(-) create mode 100644 .latexindent.yaml diff --git a/.latexindent.yaml b/.latexindent.yaml new file mode 100644 index 000000000..b3a17571f --- /dev/null +++ b/.latexindent.yaml @@ -0,0 +1 @@ +defaultIndent: ' ' diff --git a/config.yml b/config.yml index d579bd9c7..d2406faa2 100644 --- a/config.yml +++ b/config.yml @@ -834,6 +834,9 @@ notebook: - kth_root: K 次剩余 code_ext: hpp test_ext: cpp + - mex: mex + code_ext: hpp + test_ext: cpp - isqrt: 平方根下取整 code_ext: hpp test_ext: cpp @@ -843,9 +846,6 @@ notebook: - mpi: 高精度整数 code_ext: hpp test_ext: cpp - - mex: mex - code_ext: hpp - test_ext: cpp - fact_mint: 快速阶乘取模 code_ext: hpp test_ext: cpp @@ -1265,6 +1265,15 @@ code_styles: formatting_commands: cpp: - clang-format + - --Wno-error=unknown - -style=file - -i - ${filename} + tex: + - latexindent + - --cruft=/ + - -l + - -s + - ${filename} + - -o + - ${filename} diff --git a/manager.py b/manager.py index e8433e298..7f908093f 100644 --- a/manager.py +++ b/manager.py @@ -117,9 +117,11 @@ def generate_notebook_contents(logger: logging.Logger): CONFIG.get_code_dir(), CONFIG.get_doc_dir(), CONFIG.get_test_dir()) f.writelines(latex_input(PathLaTeX(doc_filepath))) if section.code_ext == 'hpp': - f.writelines(latex_listing_code_range(PathLaTeX(code_filepath), CONFIG.get_code_style(section.code_ext), 4, len(open(code_filepath).readlines())-2)) + f.writelines(latex_listing_code_range(PathLaTeX(code_filepath), CONFIG.get_code_style( + section.code_ext), 4, len(open(code_filepath).readlines())-2)) else: - f.writelines(latex_listing_code(PathLaTeX(code_filepath), CONFIG.get_code_style(section.code_ext))) + f.writelines(latex_listing_code( + PathLaTeX(code_filepath), CONFIG.get_code_style(section.code_ext))) if CONFIG.generate_test_in_notebook(): if not os.path.getsize(test_filepath): continue @@ -218,7 +220,10 @@ def _format(code_type: str): @withlog def reformat_all_codes(_code_type: str, **kwargs): - filepaths: list[str] = get_full_filenames([CONFIG.get_code_dir(), CONFIG.get_test_dir()], + filepaths: list[str] = get_full_filenames([CONFIG.get_code_dir(), + CONFIG.get_doc_dir(), + CONFIG.get_cheatsheet_dir(), + CONFIG.get_test_dir()], CONFIG.get_ext_names_by_code_style(_code_type)) kwargs.get('logger').info(f"{len(filepaths)} file(s) found") for filepath in filepaths: diff --git a/src/cheatsheet/formula.tex b/src/cheatsheet/formula.tex index 52cfccbaf..8db739153 100644 --- a/src/cheatsheet/formula.tex +++ b/src/cheatsheet/formula.tex @@ -19,7 +19,7 @@ \subsubsection{积和式} \begin{equation} \operatorname{per}(A)=\operatorname{haf}\begin{bmatrix} & A \\ - A^T & + A^T & \end{bmatrix} \end{equation} diff --git a/src/cheatsheet/nt-const.tex b/src/cheatsheet/nt-const.tex index ad12616e4..fd32822d8 100644 --- a/src/cheatsheet/nt-const.tex +++ b/src/cheatsheet/nt-const.tex @@ -20,7 +20,7 @@ \subsection{NTT 模数表} \begin{tabular}{llll|llll} \hline - 素模数 \(p=r\cdot 2^s+1\) & \(r\) & \(s\) & 原根 & 素模数 \(p=r\cdot 2^s+1\) & \(r\) & \(s\) & 原根 \\ + 素模数 \(p=r\cdot 2^s+1\) & \(r\) & \(s\) & 原根 & 素模数 \(p=r\cdot 2^s+1\) & \(r\) & \(s\) & 原根 \\ \hline \(3\) & \(1\) & \(1\) & \(2\) & \(2~281~701~377\) & \(17\) & \(27\) & \(3\) \\ \(5\) & \(1\) & \(2\) & \(2\) & \(3~221~225~473\) & \(3\) & \(30\) & \(5\) \\ diff --git a/src/cheatsheet/oeis-seq.tex b/src/cheatsheet/oeis-seq.tex index ef8a0b189..e30e7de0b 100644 --- a/src/cheatsheet/oeis-seq.tex +++ b/src/cheatsheet/oeis-seq.tex @@ -5,185 +5,177 @@ \subsection{计数相关} \begin{enumerate} - -\item \textbf{Catalan 数(A000108)} - -1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, \dots - -性质见 \fullref{sec:catalan-数}. - -\item \textbf{(大)Schr\"oder 数(A006318)} - -1, 2, 6, 22, 90, 394, 1806, 8558, 41586, 206098, 1037718, 5293446, 27297738, 142078746, 745387038, \dots \;(0-based) - -性质见 \fullref{sec:schroder-数}. - -\item \textbf{小 Schr\"oder 数(A001003)} - -1, 1, 3, 11, 45, 197, 903, 4279, 20793, 103049, 518859, 2646723, 13648869, 71039373, 372693519, \dots \;(0-based) - -性质见 \fullref{sec:schroder-数}. - -小 Schr\"oder 数除了第 \(0\) 项以外都是 Schr\"oder 数的一半. - -\item \textbf{Motzkin 数(A001006)} - -1, 1, 2, 4, 9, 21, 51, 127, 323, 835, 2188, 5798, 15511, 41835, 113634, 310572, 853467, 2356779, \dots \;(0-based) - -性质见 \fullref{sec:motzkin-数}. - -\item \textbf{将点按顺序排成一圈后不自交的树的个数(A001764)} - -1, 1, 3, 12, 55, 273, 1428, 7752, 43263, 246675, 1430715, 8414640, 50067108, 300830572, 1822766520, \dots \;(0-based) - -\[ - a_n = \frac {{3n \choose n}} {2n + 1} -\] - -也就是说, 在圆上按顺序排列的 \(n\) 个点之间连 \(n - 1\) 条不相交(除端点外)的弦, 组成一棵树的方案数. - -也等于每次只能向右或向上, 并且不能高于 \(y = 2x\) 这条直线, 从 \((0, 0)\) 走到 \((n, 2n)\) 的方案数. - -扩展: 如果改成不能高于 \(y = kx\) 这条直线, 走到 \((n, kn)\) 的方案数, 那么答案就是 \( \frac {{(k + 1)n \choose n}} {kn + 1} \). - -\item \textbf{\(n\) 个点的圆上画不相交的弦的方案数(A054726)} - -1, 1, 2, 8, 48, 352, 2880, 25216, 231168, 2190848, 21292032, 211044352, 2125246464, 21681954816, \dots \;(0-based) - -\( a_n = 2^n s_{n - 2} \; (n > 2) \), \(s_n\) 是上面的小 Schr\"oder 数. - -和上面的区别在于, 这里可以不连满 \(n-1\) 条边. 另外 Motzkin 数画的弦不能共享端点, 但是这里可以. - -\item \textbf{Wedderburn-Etherington numbers(A001190)} - -0, 1, 1, 1, 2, 3, 6, 11, 23, 46, 98, 207, 451, 983, 2179, 4850, 10905, 24631, 56011, 127912, 293547, \dots \;(0-based) - -每个结点都有 \(0\) 或者 \(2\) 个儿子, 且总共有\(n\)个叶子结点的二叉树方案数. (\textbf{无标号}) - -同时也是 \(n-1\) 个结点的\textbf{无标号}二叉树个数. - -\[ - A(x) = x + \frac {A(x) ^ 2 + A(x ^ 2)} 2 = 1 - \sqrt{1 - 2x - A(x ^ 2)} -\] - -\item \textbf{划分数(A000041)} - -1, 1, 2, 3, 5, 7, 11, 15, 22, 30, 42, 56, 77, 101, 135, 176, 231, 297, 385, 490, 627, 792, 1002, \dots \;(0-based) - -\item \textbf{Bell 数(A000110)} - -1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147, 115975, 678570, 4213597, 27644437, 190899322, 1382958545, \dots \;(0-based) - -\item \textbf{错位排列数(A0000166)} - -1, 0, 1, 2, 9, 44, 265, 1854, 14833, 133496, 1334961, 14684570, 176214841, 2290792932, 32071101049, \dots \;(0-based) - -\item \textbf{交替阶乘(A005165)} - -0, 1, 1, 5, 19, 101, 619, 4421, 35899, 326981, 3301819, 36614981, 442386619, 5784634181, 81393657019, \dots - -\[ - \begin{aligned} n! - (n - 1)! + (n - 2)! - \dots 1! = \sum_{i = 0} ^ {n - 1} (-1)^i (n - i)! \end{aligned} -\]. - -\( a_0 = 0,\; a_n = n! - a_{n - 1} \). - + \item \textbf{Catalan 数(A000108)} + + 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, \dots + + 性质见 \fullref{sec:catalan-数}. + + \item \textbf{(大)Schr\"oder 数(A006318)} + + 1, 2, 6, 22, 90, 394, 1806, 8558, 41586, 206098, 1037718, 5293446, 27297738, 142078746, 745387038, \dots \;(0-based) + + 性质见 \fullref{sec:schroder-数}. + + \item \textbf{小 Schr\"oder 数(A001003)} + + 1, 1, 3, 11, 45, 197, 903, 4279, 20793, 103049, 518859, 2646723, 13648869, 71039373, 372693519, \dots \;(0-based) + + 性质见 \fullref{sec:schroder-数}. + + 小 Schr\"oder 数除了第 \(0\) 项以外都是 Schr\"oder 数的一半. + + \item \textbf{Motzkin 数(A001006)} + + 1, 1, 2, 4, 9, 21, 51, 127, 323, 835, 2188, 5798, 15511, 41835, 113634, 310572, 853467, 2356779, \dots \;(0-based) + + 性质见 \fullref{sec:motzkin-数}. + + \item \textbf{将点按顺序排成一圈后不自交的树的个数(A001764)} + + 1, 1, 3, 12, 55, 273, 1428, 7752, 43263, 246675, 1430715, 8414640, 50067108, 300830572, 1822766520, \dots \;(0-based) + + \[ + a_n = \frac {{3n \choose n}} {2n + 1} + \] + + 也就是说, 在圆上按顺序排列的 \(n\) 个点之间连 \(n - 1\) 条不相交(除端点外)的弦, 组成一棵树的方案数. + + 也等于每次只能向右或向上, 并且不能高于 \(y = 2x\) 这条直线, 从 \((0, 0)\) 走到 \((n, 2n)\) 的方案数. + + 扩展: 如果改成不能高于 \(y = kx\) 这条直线, 走到 \((n, kn)\) 的方案数, 那么答案就是 \( \frac {{(k + 1)n \choose n}} {kn + 1} \). + + \item \textbf{\(n\) 个点的圆上画不相交的弦的方案数(A054726)} + + 1, 1, 2, 8, 48, 352, 2880, 25216, 231168, 2190848, 21292032, 211044352, 2125246464, 21681954816, \dots \;(0-based) + + \( a_n = 2^n s_{n - 2} \; (n > 2) \), \(s_n\) 是上面的小 Schr\"oder 数. + + 和上面的区别在于, 这里可以不连满 \(n-1\) 条边. 另外 Motzkin 数画的弦不能共享端点, 但是这里可以. + + \item \textbf{Wedderburn-Etherington numbers(A001190)} + + 0, 1, 1, 1, 2, 3, 6, 11, 23, 46, 98, 207, 451, 983, 2179, 4850, 10905, 24631, 56011, 127912, 293547, \dots \;(0-based) + + 每个结点都有 \(0\) 或者 \(2\) 个儿子, 且总共有\(n\)个叶子结点的二叉树方案数. (\textbf{无标号}) + + 同时也是 \(n-1\) 个结点的\textbf{无标号}二叉树个数. + + \[ + A(x) = x + \frac {A(x) ^ 2 + A(x ^ 2)} 2 = 1 - \sqrt{1 - 2x - A(x ^ 2)} + \] + + \item \textbf{划分数(A000041)} + + 1, 1, 2, 3, 5, 7, 11, 15, 22, 30, 42, 56, 77, 101, 135, 176, 231, 297, 385, 490, 627, 792, 1002, \dots \;(0-based) + + \item \textbf{Bell 数(A000110)} + + 1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147, 115975, 678570, 4213597, 27644437, 190899322, 1382958545, \dots \;(0-based) + + \item \textbf{错位排列数(A0000166)} + + 1, 0, 1, 2, 9, 44, 265, 1854, 14833, 133496, 1334961, 14684570, 176214841, 2290792932, 32071101049, \dots \;(0-based) + + \item \textbf{交替阶乘(A005165)} + + 0, 1, 1, 5, 19, 101, 619, 4421, 35899, 326981, 3301819, 36614981, 442386619, 5784634181, 81393657019, \dots + + \[ + \begin{aligned} n! - (n - 1)! + (n - 2)! - \dots 1! = \sum_{i = 0} ^ {n - 1} (-1)^i (n - i)! \end{aligned} + \]. + + \( a_0 = 0,\; a_n = n! - a_{n - 1} \). \end{enumerate} \subsection{线性递推数列} \begin{enumerate} - -\item \textbf{Lucas 数(A000032)} - -2, 1, 3, 4, 7, 11, 18, 29, 47, 76, 123, 199, 322, 521, 843, 1364, 2207, 3571, 5778, 9349, 15127, \dots - -\item \textbf{Fibonacci 数(A000045)} - -0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, \dots - -\item \textbf{Tribonacci 数(A000071)} - -0, 0, 1, 1, 2, 4, 7, 13, 24, 44, 81, 149, 274, 504, 927, 1705, 3136, 5768, 10609, 19513, 35890, \dots - -\( a_0 = a_1 = 0,\; a_2 = 1,\; a_n = a_{n - 1} + a_{n - 2} + a_{n - 3} \). - -\item \textbf{Pell 数(A0000129)} - -0, 1, 2, 5, 12, 29, 70, 169, 408, 985, 2378, 5741, 13860, 33461, 80782, 195025, 470832, 1136689, \dots - -\( a_0 = 0,\; a_1 = 1,\; a_n = 2a_{n - 1} + a_{n - 2} \). - -\item \textbf{Padovan 数(A0000931)} - -1, 0, 0, 1, 0, 1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28, 37, 49, 65, 86, 114, 151, 200, 265, 351, 465, 616, 816, 1081, 1432, 1897, 2513, 3329, 4410, 5842, 7739, 10252, 13581, 17991, 23833, 31572, \dots - -\(a_0 = 1,\; a_1 = a_2 = 0,\; a_n = a_{n - 2} + a_{n - 3}\). - -\item \textbf{Jacobsthal numbers(A001045)} - -0, 1, 1, 3, 5, 11, 21, 43, 85, 171, 341, 683, 1365, 2731, 5461, 10923, 21845, 43691, 87381, 174763, \dots - -\( a_0 = 0,\; a_1 = 1.\; a_n = a_{n - 1} + 2a_{n - 2} \) - -同时也是最接近\(\frac {2 ^ n} 3\)的整数. - -\item \textbf{Perrin 数(A001608)} - -3, 0, 2, 3, 2, 5, 5, 7, 10, 12, 17, 22, 29, 39, 51, 68, 90, 119, 158, 209, 277, 367, 486, 644, 853, \dots - -\( a_0 = 3,\; a_1 = 0,\; a_2 = 2,\; a_n = a_{n - 2} + a_{n - 3} \) - + \item \textbf{Lucas 数(A000032)} + + 2, 1, 3, 4, 7, 11, 18, 29, 47, 76, 123, 199, 322, 521, 843, 1364, 2207, 3571, 5778, 9349, 15127, \dots + + \item \textbf{Fibonacci 数(A000045)} + + 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, \dots + + \item \textbf{Tribonacci 数(A000071)} + + 0, 0, 1, 1, 2, 4, 7, 13, 24, 44, 81, 149, 274, 504, 927, 1705, 3136, 5768, 10609, 19513, 35890, \dots + + \( a_0 = a_1 = 0,\; a_2 = 1,\; a_n = a_{n - 1} + a_{n - 2} + a_{n - 3} \). + + \item \textbf{Pell 数(A0000129)} + + 0, 1, 2, 5, 12, 29, 70, 169, 408, 985, 2378, 5741, 13860, 33461, 80782, 195025, 470832, 1136689, \dots + + \( a_0 = 0,\; a_1 = 1,\; a_n = 2a_{n - 1} + a_{n - 2} \). + + \item \textbf{Padovan 数(A0000931)} + + 1, 0, 0, 1, 0, 1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28, 37, 49, 65, 86, 114, 151, 200, 265, 351, 465, 616, 816, 1081, 1432, 1897, 2513, 3329, 4410, 5842, 7739, 10252, 13581, 17991, 23833, 31572, \dots + + \(a_0 = 1,\; a_1 = a_2 = 0,\; a_n = a_{n - 2} + a_{n - 3}\). + + \item \textbf{Jacobsthal numbers(A001045)} + + 0, 1, 1, 3, 5, 11, 21, 43, 85, 171, 341, 683, 1365, 2731, 5461, 10923, 21845, 43691, 87381, 174763, \dots + + \( a_0 = 0,\; a_1 = 1.\; a_n = a_{n - 1} + 2a_{n - 2} \) + + 同时也是最接近\(\frac {2 ^ n} 3\)的整数. + + \item \textbf{Perrin 数(A001608)} + + 3, 0, 2, 3, 2, 5, 5, 7, 10, 12, 17, 22, 29, 39, 51, 68, 90, 119, 158, 209, 277, 367, 486, 644, 853, \dots + + \( a_0 = 3,\; a_1 = 0,\; a_2 = 2,\; a_n = a_{n - 2} + a_{n - 3} \) \end{enumerate} \subsection{数论相关} \begin{enumerate} - -\item \textbf{Carmichael 数, 伪质数(A002997)} - -561, 1105, 1729, 2465, 2821, 6601, 8911, 10585, 15841, 29341, 41041, 46657, 52633, 62745, 63973, 75361, 101101, 115921, 126217, 162401, 172081, 188461, 252601, 278545, 294409, 314821, 334153, 340561, 399001, 410041, 449065, 488881, 512461, \dots - -满足 \(\forall\) 与 \(n\) 互质的 \(a\), 都有 \(a ^ {n - 1} \equiv 1 \pmod n\) 的所有\textbf{合数} \(n\) 被称为 Carmichael 数. - -Carmichael数在 \(10^8\) 以内只有255个. - -\item \textbf{反质数(A002182)} - -1, 2, 4, 6, 12, 24, 36, 48, 60, 120, 180, 240, 360, 720, 840, 1260, 1680, 2520, 5040, 7560, 10080, 15120, 20160, 25200, 27720, 45360, 50400, 55440, 83160, 110880, 166320, 221760, 277200, 332640, 498960, 554400, 665280, 720720, 1081080, 1441440, 2162160, \dots - -比所有更小的数的约数数量都更多的数. - -\item \textbf{前 \(n\) 个质数的乘积(A002110)} - -1, 2, 6, 30, 210, 2310, 30030, 510510, 9699690, 223092870, 6469693230, 200560490130,\\7420738134810, \dots - -\item \textbf{Mersenne 质数(A000668)} - -3, 7, 31, 127, 8191, 131071, 524287, 2147483647, 2305843009213693951,\\618970019642690137449562111, 162259276829213363391578010288127,\\170141183460469231731687303715884105727 - -\(p\) 是质数, 同时 \(2^p - 1\) 也是质数. - + \item \textbf{Carmichael 数, 伪质数(A002997)} + + 561, 1105, 1729, 2465, 2821, 6601, 8911, 10585, 15841, 29341, 41041, 46657, 52633, 62745, 63973, 75361, 101101, 115921, 126217, 162401, 172081, 188461, 252601, 278545, 294409, 314821, 334153, 340561, 399001, 410041, 449065, 488881, 512461, \dots + + 满足 \(\forall\) 与 \(n\) 互质的 \(a\), 都有 \(a ^ {n - 1} \equiv 1 \pmod n\) 的所有\textbf{合数} \(n\) 被称为 Carmichael 数. + + Carmichael数在 \(10^8\) 以内只有255个. + + \item \textbf{反质数(A002182)} + + 1, 2, 4, 6, 12, 24, 36, 48, 60, 120, 180, 240, 360, 720, 840, 1260, 1680, 2520, 5040, 7560, 10080, 15120, 20160, 25200, 27720, 45360, 50400, 55440, 83160, 110880, 166320, 221760, 277200, 332640, 498960, 554400, 665280, 720720, 1081080, 1441440, 2162160, \dots + + 比所有更小的数的约数数量都更多的数. + + \item \textbf{前 \(n\) 个质数的乘积(A002110)} + + 1, 2, 6, 30, 210, 2310, 30030, 510510, 9699690, 223092870, 6469693230, 200560490130,\\7420738134810, \dots + + \item \textbf{Mersenne 质数(A000668)} + + 3, 7, 31, 127, 8191, 131071, 524287, 2147483647, 2305843009213693951,\\618970019642690137449562111, 162259276829213363391578010288127,\\170141183460469231731687303715884105727 + + \(p\) 是质数, 同时 \(2^p - 1\) 也是质数. \end{enumerate} \subsection{其他} \begin{enumerate} - -\item \textbf{Bernoulli 数(A027641)} - -见 \fullref{sec:bernoulli-数与自然数幂和}. - -\item \textbf{四个柱子的汉诺塔(A007664)} - -0, 1, 3, 5, 9, 13, 17, 25, 33, 41, 49, 65, 81, 97, 113, 129, 161, 193, 225, 257, 289, 321, 385, 449, \dots - -差分之后可以发现其实就是 1 次 +1, 2 次 +2, 3 次 +4, 4 次 +8\dots 的规律. - -\item \textbf{Ulam 数(A002858)} - -1, 2, 3, 4, 6, 8, 11, 13, 16, 18, 26, 28, 36, 38, 47, 48, 53, 57, 62, 69, 72, 77, 82, 87, 97, 99, 102, 106, 114, 126, 131, 138, 145, 148, 155, 175, 177, 180, 182, 189, 197, 206, 209, 219, 221, 236, 238, 241, 243, 253, 258, 260, 273, 282, 309, 316, 319, 324, 339, \dots - -\( a_1 = 1,\; a_2 = 2 \), \(a_n\) 表示在所有 \(>a_{n-1}\) 的数中, 最小的, 能被表示成 (前面的两个不同的元素的和) 的数. - + \item \textbf{Bernoulli 数(A027641)} + + 见 \fullref{sec:bernoulli-数与自然数幂和}. + + \item \textbf{四个柱子的汉诺塔(A007664)} + + 0, 1, 3, 5, 9, 13, 17, 25, 33, 41, 49, 65, 81, 97, 113, 129, 161, 193, 225, 257, 289, 321, 385, 449, \dots + + 差分之后可以发现其实就是 1 次 +1, 2 次 +2, 3 次 +4, 4 次 +8\dots 的规律. + + \item \textbf{Ulam 数(A002858)} + + 1, 2, 3, 4, 6, 8, 11, 13, 16, 18, 26, 28, 36, 38, 47, 48, 53, 57, 62, 69, 72, 77, 82, 87, 97, 99, 102, 106, 114, 126, 131, 138, 145, 148, 155, 175, 177, 180, 182, 189, 197, 206, 209, 219, 221, 236, 238, 241, 243, 253, 258, 260, 273, 282, 309, 316, 319, 324, 339, \dots + + \( a_1 = 1,\; a_2 = 2 \), \(a_n\) 表示在所有 \(>a_{n-1}\) 的数中, 最小的, 能被表示成 (前面的两个不同的元素的和) 的数. \end{enumerate} diff --git a/src/cheatsheet/seqences.tex b/src/cheatsheet/seqences.tex index 4974ba752..7d65f5ba7 100644 --- a/src/cheatsheet/seqences.tex +++ b/src/cheatsheet/seqences.tex @@ -24,11 +24,11 @@ \subsubsection{通项公式} \[ F_n = \frac{\phi^n - {\hat\phi}^n}{\sqrt 5}, \, L_n = \phi^n + {\hat\phi}^n \] - + 其中 \(\phi = \dfrac{1 + \sqrt 5}{2}, \, \hat\phi = \dfrac{1 - \sqrt 5}{2}\) - + 实际上有 \(\dfrac{L_n + F_n \sqrt 5}{2} = \left( \dfrac{1 + \sqrt 5}{2} \right)^n\), 所以求通项的话写一个类然后快速幂就可以同时得到两者. - + \subsubsection{快速倍增法} \[ @@ -235,7 +235,7 @@ \subsubsection{Eulerian Number} \] \[ - x^n = \sum_{k = 0} ^ {n - 1} \eulerian{n}{k} \binom{x+k}{n} + x^n = \sum_{k = 0} ^ {n - 1} \eulerian{n}{k} \binom{x+k}{n} \] \[ diff --git a/src/code/opt/simplex.hpp b/src/code/opt/simplex.hpp index 6f1d9aa53..26d85454f 100644 --- a/src/code/opt/simplex.hpp +++ b/src/code/opt/simplex.hpp @@ -62,8 +62,8 @@ struct LPSolver { for (int i = (1); i < m; ++i) if (D[i][n + 1] < D[r][n + 1]) r = i; if (D[r][n + 1] < -eps_v) { // if not, find feasible start - pivot(r, n); // make artificial variable basic - assert(simplex(2)); // I think this will always be true?? + pivot(r, n); // make artificial variable basic + assert(simplex(2)); // I think this will always be true?? if (D[m + 1][n + 1] < -eps_v) return -inf; // D[m+1][n+1] is max possible value of the negation of // artificial variable, optimal value should be zero diff --git a/src/code/str/suffix_automaton.hpp b/src/code/str/suffix_automaton.hpp index cacdd5018..f74d4138b 100644 --- a/src/code/str/suffix_automaton.hpp +++ b/src/code/str/suffix_automaton.hpp @@ -11,10 +11,10 @@ class suffix_automaton { struct YYZ { u32 len, link; std::array nex{}; - u64 sz; // application 1 - u32 times; // application 2 - bool is_clone; // application 3 - u32 firstpos; // application 3 + u64 sz; // app 1 + u32 times; // app 2 + bool is_clone; // app 3 + u32 firstpos; // app 3 }; public: @@ -28,8 +28,8 @@ class suffix_automaton { u32 cur = sz++; st.push_back(YYZ()); st[cur].len = st[last].len + 1; - st[cur].times = 1; // application 2 - st[cur].firstpos = st[cur].len - 1; // application 3 + st[cur].times = 1; // app 2 + st[cur].firstpos = st[cur].len - 1; // app 3 u32 p = last; while (p != -1u && !st[p].nex[c]) st[p].nex[c] = cur, p = st[p].link; @@ -43,8 +43,8 @@ class suffix_automaton { st[clone].nex = st[q].nex; st[clone].len = st[p].len + 1; st[clone].link = st[q].link; - st[clone].firstpos = st[q].firstpos; // application 3 - st[clone].is_clone = 1; // application 3 + st[clone].firstpos = st[q].firstpos; // app 3 + st[clone].is_clone = 1; // app 3 while (p != -1u && st[p].nex[c] == q) st[p].nex[c] = clone, p = st[p].link; st[q].link = st[cur].link = clone; @@ -58,7 +58,7 @@ class suffix_automaton { for (u32 i = 1; i < sz; ++i) add(u32(st[i].link), i); } - // application 0 + // app 0 //! default: each character of t is lowercase English letters. constexpr std::pair search(std::string t) { u32 u = 0, i = 0, base = u32('a'); @@ -68,7 +68,7 @@ class suffix_automaton { } return {u32(u), true}; } - // application 1 + // app 1 constexpr void getsz(u32 u = 0) { st[u].sz = 1; for (auto v : st[u].nex) @@ -77,18 +77,18 @@ class suffix_automaton { st[u].sz += st[v].sz; } } - // application 2 + // app 2 //! need build() constexpr void gettimes(u32 u = 0) { for (auto v : e[u]) gettimes(v), st[u].times += st[v].times; } - // application 3 + // app 3 //! need build(), search() constexpr void output_all_occurrences(u32 u, u32 P_length, vec &ans) { if (!st[u].is_clone) ans.push_back(st[u].first_pos - P_length + 1); for (u32 v : e[u]) output_all_occurrences(v, P_length, ans); } - // application 4 + // app 4 //! default: each character of t is lowercase English letters. constexpr ptt lcs(std::string_view t) { u32 v = 0, len = 0, ret = 0, end = 0, base = u32('a'); diff --git a/src/doc_tex/conv/karatsuba.tex b/src/doc_tex/conv/karatsuba.tex index fa2f1f926..e7d53468b 100644 --- a/src/doc_tex/conv/karatsuba.tex +++ b/src/doc_tex/conv/karatsuba.tex @@ -1,4 +1,4 @@ -计算 \(\mathrm{Z}/2^{64}\mathrm{Z}\) 下的卷积 +计算 \(\mathbb{Z}/2^{64}\mathbb{Z}\) 下的卷积 \paragraph{输入} diff --git a/src/doc_tex/ds/link_cut_tree.tex b/src/doc_tex/ds/link_cut_tree.tex index 4d9a00d5a..442cc2a72 100644 --- a/src/doc_tex/ds/link_cut_tree.tex +++ b/src/doc_tex/ds/link_cut_tree.tex @@ -1,9 +1,9 @@ -注意lct的实现是建立在编号从1开始,但调用lct的公开函数是编号从0开始 +注意 lct 的实现是建立在编号从 \(1\) 开始, 但调用 lct 的公开函数是编号从 \(0\) 开始 -此模板仅维护了树的增减边, 路径信息(权值和,积,最值,路径长度), 子树信息(权值和,子树大小) +此模板仅维护了树的增减边, 路径信息 (权值和, 积, 最值, 路径长度), 子树信息 (权值和, 子树大小) \begin{itemize} - \item 对于维护子树的最值,由于min,max不存在逆变换,所以此模板无法使用,但可以对于每个点维护一个平衡树(set),来存储其子树最值 - \item 对于维护边权(生成树),可以化边为点将大小为n的树化成大小为n + n - 1的树,其中n个点无点权,n-1个点的点权存边权 - \item 对于维护双连通分量, 在link时如果连接失败(产生了环,且将返回false),在返回前将这个环缩成一个点,可以用并查集维护 + \item 对于维护子树的最值, 由于 min, max 不存在逆变换, 所以此模板无法使用, 但可以对于每个点维护一个平衡树(set), 来存储其子树最值 + \item 对于维护边权 (生成树), 可以化边为点将大小为 \(n\) 的树化成大小为 \(2n - 1\) 的树, 其中 \(n\) 个点无点权, \(n-1\) 个点的点权存边权 + \item 对于维护双连通分量, 在 link 时如果连接失败 (产生了环, 且将返回 false), 在返回前将这个环缩成一个点, 可以用并查集维护 \end{itemize} \ No newline at end of file diff --git a/src/doc_tex/ds/segtree.tex b/src/doc_tex/ds/segtree.tex index a0d74e0b6..969e986ba 100644 --- a/src/doc_tex/ds/segtree.tex +++ b/src/doc_tex/ds/segtree.tex @@ -2,15 +2,15 @@ \begin{tabular}{ll} \hline - 代码 & 备注 \\ + 代码 & 备注 \\ \hline - \verb|class T| & 维护的数据 \\ - \verb|T (*op)(T, T)| & 维护的操作 \\ - \verb|T (*e)()| & T的幺元 \\ + \verb|class T| & 维护的数据 \\ + \verb|T (*op)(T, T)| & 维护的操作 \\ + \verb|T (*e)()| & T的幺元 \\ \verb|class F| & 修改的类型(会用于lazy标记) \\ \verb|T (*mapping)(F, T) f(x)| & 即修改怎么应用于数据 \\ - \verb|F (*composition)(F, F) f(g(x))| & 即修改的复合 \\ - \verb|F (*id)() id(x) = x| & 即恒等映射 \\ + \verb|F (*composition)(F, F) f(g(x))| & 即修改的复合 \\ + \verb|F (*id)() id(x) = x| & 即恒等映射 \\ \hline \end{tabular} diff --git a/src/doc_tex/fast/rsort32.tex b/src/doc_tex/fast/rsort32.tex index 67d6e6aea..e69de29bb 100644 --- a/src/doc_tex/fast/rsort32.tex +++ b/src/doc_tex/fast/rsort32.tex @@ -1,3 +0,0 @@ -\paragraph{复杂度} - -\textit{O(松)} diff --git a/src/doc_tex/fast/str2uint_mod.tex b/src/doc_tex/fast/str2uint_mod.tex index 748df7c7a..e69de29bb 100644 --- a/src/doc_tex/fast/str2uint_mod.tex +++ b/src/doc_tex/fast/str2uint_mod.tex @@ -1,3 +0,0 @@ -\paragraph{注意} - -只能用于小端序的环境 diff --git a/src/doc_tex/fast/str2uint_si64.tex b/src/doc_tex/fast/str2uint_si64.tex index 0b9a43193..6d84a52bf 100644 --- a/src/doc_tex/fast/str2uint_si64.tex +++ b/src/doc_tex/fast/str2uint_si64.tex @@ -1,7 +1,3 @@ -\paragraph{注意} - -只能用于小端序的环境 - \paragraph{输入} \verb|s|: 整数字符串, 假定长度至少为 8 且只含 0-9 diff --git a/src/doc_tex/fast/strhex2uint_si64.tex b/src/doc_tex/fast/strhex2uint_si64.tex index 27d01845b..67e5b5bfc 100644 --- a/src/doc_tex/fast/strhex2uint_si64.tex +++ b/src/doc_tex/fast/strhex2uint_si64.tex @@ -1,7 +1,3 @@ -\paragraph{注意} - -只能用于小端序的环境 - \paragraph{输入} \verb|s|: 整数字符串, 假定长度至少为 8 且只含 0-9, A-F 和 a-f diff --git a/src/doc_tex/fast/u32tostr.tex b/src/doc_tex/fast/u32tostr.tex index e9541b44b..dae9984ef 100644 --- a/src/doc_tex/fast/u32tostr.tex +++ b/src/doc_tex/fast/u32tostr.tex @@ -4,9 +4,10 @@ \paragraph{输入} -\verb|num|: 32 位整数 - -\verb|s|: 出参, 为转换后的字符串 +\begin{itemize} + \item \verb|num|: 32 位整数 + \item \verb|s|: 出参, 为转换后的字符串 +\end{itemize} \paragraph{输出} diff --git a/src/doc_tex/fast/u32tostrhex.tex b/src/doc_tex/fast/u32tostrhex.tex index 9ea360c40..9aeb82054 100644 --- a/src/doc_tex/fast/u32tostrhex.tex +++ b/src/doc_tex/fast/u32tostrhex.tex @@ -4,9 +4,10 @@ \paragraph{输入} -\verb|x|: 32 位整数 - -\verb|s|: 出参, 为转换后的字符串 +\begin{itemize} + \item \verb|x|: 32 位整数 + \item \verb|s|: 出参, 为转换后的字符串 +\end{itemize} \verb|lowerAlpha|: 是否使用小写字母 diff --git a/src/doc_tex/geo2d/triangle.tex b/src/doc_tex/geo2d/triangle.tex index e19ca87da..14e236494 100644 --- a/src/doc_tex/geo2d/triangle.tex +++ b/src/doc_tex/geo2d/triangle.tex @@ -8,4 +8,6 @@ \verb|barycentrics|: 重心坐标, \verb|barycentrics(u, v, w)| 即为 \((u\cdot A+v\cdot B+w\cdot C)/(u+v+w)\) -\verb|trilinears(x, y, z) == barycentrics(a*x, b*y, c*z)|, \verb|barycentrics(u, v, w) == trilinears(u/a, v/b, w/c)| +\verb|trilinears(x, y, z) == barycentrics(a*x, b*y, c*z)| + +\verb|barycentrics(u, v, w) == trilinears(u/a, v/b, w/c)| diff --git a/src/doc_tex/math/berlekamp_massey.tex b/src/doc_tex/math/berlekamp_massey.tex index f0078ceaa..5020afb31 100644 --- a/src/doc_tex/math/berlekamp_massey.tex +++ b/src/doc_tex/math/berlekamp_massey.tex @@ -6,8 +6,8 @@ \paragraph{注意} -返回的是 \(1-c_1 x -c_2 x^2-\dots\), 这是为了便于计算 \(a\) 的某一项, 具体参见 \fullref{sec:线性递推数列的第-k-项} +返回的是 \(1-c_1 x -c_2 x^2-\dots\), 这是为了便于计算 \(a\) 的某一项, 具体参见 \fullref{sec:线性递推数列的第-n-项} -\paragraph{复杂度} +\paragraph{复杂度} \(O(|a|\cdot |c|)=O\left(|a|^2\right)\) \ No newline at end of file diff --git a/src/doc_tex/math/cantor.tex b/src/doc_tex/math/cantor.tex index e87ecf610..b42c8be74 100644 --- a/src/doc_tex/math/cantor.tex +++ b/src/doc_tex/math/cantor.tex @@ -1,11 +1,13 @@ \paragraph{输入} -\verb|p|: \verb|1..n| 的一个排列, 下标从 \(0\) 开始 - -\verb|mod|: 模数 +\begin{itemize} + \item \verb|p|: \verb|1..n| 的一个排列, 下标从 \(0\) 开始 + \item \verb|mod|: 模数 +\end{itemize} \paragraph{输出} -\verb|cantor_seq|: 返回 Cantor 展开得到的序列 \(S\), 下标从 \(0\) 开始 - -\verb|cantor_val|: 返回 Cantor 展开的值, 即 \(\sum_{i=0}^{n-1}S_i(n-1-i)!\bmod \texttt{mod}\) +\begin{itemize} + \item \verb|cantor_seq|: 返回 Cantor 展开得到的序列 \(S\), 下标从 \(0\) 开始 + \item \verb|cantor_val|: 返回 Cantor 展开的值, 即 \(\sum_{i=0}^{n-1}S_i(n-1-i)!\bmod \texttt{mod}\) +\end{itemize} diff --git a/src/doc_tex/math/exeuclid.tex b/src/doc_tex/math/exeuclid.tex index c0e319707..98dc6f90a 100644 --- a/src/doc_tex/math/exeuclid.tex +++ b/src/doc_tex/math/exeuclid.tex @@ -1,6 +1,8 @@ 考虑直线 \(s=\frac{px+r}{q},~x\in (0,l]\), 以及所有的竖线 \(x=k,~k\in\mathbf{Z}\) 与横线 \(y=h,~h\in\mathbf{Z}\) -从左向右扫描直线 \(s\), 若遇到与横线的交点, 则执行操作 \(a\), 若遇到与竖线的交点, 则执行操作 \(b\), 若同时遇到横线与竖线的交点, 则先执行操作 \(a\) 再执行操作 \(b\) +从左向右扫描直线 \(s\), 若遇到与横线的交点, 则执行操作 \(a\); 若遇到与竖线的交点, 则执行操作 \(b\); + +若同时遇到横线与竖线的交点, 则先执行操作 \(a\) 再执行操作 \(b\). 用 \(F(p,q,r,l,a,b)\) 表示上述操作的序列, 如 \(F(3,5,2,6,a,b)=abbabbabab\) @@ -9,29 +11,29 @@ \begin{enumerate} \item \(p\geq q\) 时, 令 \(b'=a^{p/q}b\), 则 \(F(p,q,r,l,a,b)=F(p\bmod q,q,r,l,a,b')\) \item \(p \left\lfloor\frac{p\alpha+r}{q}\right\rfloor \implies \alpha \leq \left\lfloor\frac{q\beta-r-1}{p}\right\rfloor \] - + 即第 \(\beta\) 个 \(b\) 之前有 \(\left\lfloor\frac{q\beta-r-1}{p}\right\rfloor\) 个 \(a\) - + 迭代的子问题应该与原问题形式相同, 所以第一个 \(a\) 之前的操作应该被截掉, 对第一个 \(a\) 之后的部分进行递归 - + 假设现在去掉了第一个 \(a\) 以及它之前的 \(b\), 则剩余的第 \(c\) 个 \(a\) 与第 \(c-1\) 个 \(a\) 之间剩余的 \(b\) 的个数为 - + \[ \left\lfloor\frac{q(c+1)-r-1}{p}\right\rfloor-\left\lfloor\frac{qc-r-1}{p}\right\rfloor=\left\lfloor\frac{qc+q-r-1}{p}\right\rfloor-\left\lfloor\frac{q(c-1)+q-r-1}{p}\right\rfloor \] - + 从而 \[ F(p,q,r,l,a,b)=b^{\left\lfloor (q-r-1)/p \right\rfloor}aF(q,p,(q-r-1)\bmod p,c-1,b,a)b^{l-\left\lfloor (qc-r-1)/p \right\rfloor} \] - + 其中 \(c=\left\lfloor\frac{pl+r}{q}\right\rfloor\) \end{enumerate} diff --git a/src/doc_tex/math/proot_gint.tex b/src/doc_tex/math/proot_gint.tex index fbf736456..9899d826b 100644 --- a/src/doc_tex/math/proot_gint.tex +++ b/src/doc_tex/math/proot_gint.tex @@ -4,7 +4,7 @@ \[ \left(1+b\sqrt{k}\right)^{m+1}\equiv 1+b^2 k^{(m+1)/2} + b\left(1+k^{(m-1)/2}\right)\sqrt{k} \equiv\begin{cases} - 1-b^2 k, & \left(\frac{k}{m}\right)=1 \\ + 1-b^2 k, & \left(\frac{k}{m}\right)=1 \\ 1+b^2 k + 2b\sqrt{k}, & \left(\frac{k}{m}\right)=-1 \\ \end{cases} \pmod m \] diff --git a/src/doc_tex/math/qtetra_mod.tex b/src/doc_tex/math/qtetra_mod.tex index e69de29bb..969964a49 100644 --- a/src/doc_tex/math/qtetra_mod.tex +++ b/src/doc_tex/math/qtetra_mod.tex @@ -0,0 +1,8 @@ +求 \(a\uparrow\uparrow b\bmod m\). + +\[ + a\uparrow\uparrow n:=\begin{cases} + 1, & n=0, \\ + a^{a\uparrow\uparrow (n-1)}, & n>0. + \end{cases} +\] diff --git a/src/doc_tex/opt/alpha_beta.tex b/src/doc_tex/opt/alpha_beta.tex index 56a7142f2..2d95b4851 100644 --- a/src/doc_tex/opt/alpha_beta.tex +++ b/src/doc_tex/opt/alpha_beta.tex @@ -1,8 +1,9 @@ \paragraph{输入} -\verb|tr|: 树, 边必须为从父结点指向子结点的\textbf{有向边}. - -\verb|v_weight|: 点的权值, 只有叶子结点的权值会被使用. +\begin{itemize} + \item \verb|tr|: 树, 边必须为从父结点指向子结点的\textbf{有向边}. + \item \verb|v_weight|: 点的权值, 只有叶子结点的权值会被使用. +\end{itemize} \paragraph{复杂度} diff --git a/src/doc_tex/opt/simplex.tex b/src/doc_tex/opt/simplex.tex index 4903858be..1ff0bac45 100644 --- a/src/doc_tex/opt/simplex.tex +++ b/src/doc_tex/opt/simplex.tex @@ -13,34 +13,34 @@ \inputminted{cpp}{src/src/simplex_usage.txt} -\paragraph{原问题与对偶问题} +\paragraph{原问题与对偶问题}~\\ -\begin{tabular}{|c|c|} +\begin{tabular}{c|c} \hline - 原问题 & 对偶问题 \\ + 原问题 & 对偶问题 \\ \hline - \(\max_x c^T x\) & \(\min_y b^T y\) \\ + \(\max_x c^T x\) & \(\min_y b^T y\) \\ \hline - \(n\) 个变量 \(x_1,\dots,x_n\) & \(n\) 个限制条件 \(A^T y\gtreqqless c\) \\ - \(x_i\geq 0\) & 第 \(i\) 个限制条件为 \(\geq c_i\) \\ - \(x_i\leq 0\) & 第 \(i\) 个限制条件为 \(\leq c_i\) \\ - \(x_i\in \mathrm{R}\) & 第 \(i\) 个限制条件为 \(=c_i\) \\ + \(n\) 个变量 \(x_1,\dots,x_n\) & \(n\) 个限制条件 \(A^T y\gtreqqless c\) \\ + \(x_i\geq 0\) & 第 \(i\) 个限制条件为 \(\geq c_i\) \\ + \(x_i\leq 0\) & 第 \(i\) 个限制条件为 \(\leq c_i\) \\ + \(x_i\in \mathrm{R}\) & 第 \(i\) 个限制条件为 \(=c_i\) \\ \hline - \(m\) 个限制条件 \(Ax\gtreqqless b\) & \(m\) 个变量 \(y_1,\dots,y_m\) \\ - 第 \(i\) 个限制条件为 \(\geq b_i\) & \(y_i\leq 0\) \\ - 第 \(i\) 个限制条件为 \(\leq b_i\) & \(y_i\geq 0\) \\ - 第 \(i\) 个限制条件为 \(=b_i\) & \(y_i\in \mathrm{R}\) \\ + \(m\) 个限制条件 \(Ax\gtreqqless b\) & \(m\) 个变量 \(y_1,\dots,y_m\) \\ + 第 \(i\) 个限制条件为 \(\geq b_i\) & \(y_i\leq 0\) \\ + 第 \(i\) 个限制条件为 \(\leq b_i\) & \(y_i\geq 0\) \\ + 第 \(i\) 个限制条件为 \(=b_i\) & \(y_i\in \mathrm{R}\) \\ \hline \end{tabular} -\begin{tabular}{|cc|cc|} +\begin{tabular}{cc|cc} \hline \multicolumn{2}{|c|}{原问题} & \multicolumn{2}{|c|}{对偶问题} \\ \hline - \(\max\) & \(3x_1+4x_2\) & \(\min\) & \(7y_1\) \\ - \(\textrm{s.t.}\) & \(5x_1+6x_2=7\) & \(\textrm{s.t.}\) & \(5y_1\geq 3\) \\ - & & & \(6y_2\geq 4\) \\ - & \(x_1\geq 0,x_2\geq 0\) & & \(y_1\in\mathrm{R}\) \\ + \(\max\) & \(3x_1+4x_2\) & \(\min\) & \(7y_1\) \\ + \(\textrm{s.t.}\) & \(5x_1+6x_2=7\) & \(\textrm{s.t.}\) & \(5y_1\geq 3\) \\ + & & & \(6y_2\geq 4\) \\ + & \(x_1\geq 0,x_2\geq 0\) & & \(y_1\in\mathrm{R}\) \\ \hline \end{tabular} diff --git a/src/doc_tex/str/lyndon.tex b/src/doc_tex/str/lyndon.tex index 1b8ff9307..a684c6a14 100644 --- a/src/doc_tex/str/lyndon.tex +++ b/src/doc_tex/str/lyndon.tex @@ -31,6 +31,7 @@ \paragraph{参考链接} -\url{https://oi-wiki.org/string/minimal-string/} - -\url{https://oi-wiki.org/string/lyndon/} +\begin{itemize} + \item \url{https://oi-wiki.org/string/minimal-string/} + \item \url{https://oi-wiki.org/string/lyndon/} +\end{itemize} diff --git a/src/doc_tex/str/suffix_automaton.tex b/src/doc_tex/str/suffix_automaton.tex index 1e178f48e..87ec1ecd4 100644 --- a/src/doc_tex/str/suffix_automaton.tex +++ b/src/doc_tex/str/suffix_automaton.tex @@ -1,26 +1,13 @@ -\begin{itemize} - \item application 0\\ - 检查字符串 \verb|t| 是否出现, 如果未出现返回 \{出现的最大前缀长度 \verb|len|, \verb|false|\}, 如果出现则返回 \{该串所对应状态 \verb|u|, \verb|true|\} - - \item application 1\\ - 求不同子串个数, 答案即 \verb|sam.st.sz[0] - 1| - - \item application 2\\ - 求每一个 \verb|endpos| 内部串的出现次数, 答案即 \verb|sam.st.times[i]| - - \item application 3\\ - 求每个状态的第一次出现这个状态的末端的位置 \verb|sam.st.firstpos| - - 对于字符串 \verb|t|, 调用 \verb|search(t)| 后, 第一次出现的位置即 \begin{verbatim}sam.st.firstpos[u] - |P| + 1\end{verbatim} - - \verb|t| 的每一个出现位置: 遍历所有以状态 \verb|u| 为后缀的状态 \verb|v|, 答案即 \begin{verbatim}{sam.st.firstpos[v] - |P| + 1}\end{verbatim} - - \item application 4\\ - 求 \verb|s| 与 \verb|t| 的最长公共子串, 其中 \verb|sam| 由 \verb|s| 建立 - - \item application others 0\\ - 所有不同子串的总长度, 字典序第 \(k\) 大子串, 最短的没有出现的字符串 (给定字符集): \verb|dp| - - \item application others 1\\ - 多个字符串间的最长公共子串, 见 \fullref{sec:广义后缀自动机} -\end{itemize} \ No newline at end of file +\begin{enumerate} + \item[app 0] 检查字符串 \verb|t| 是否出现, 如果未出现返回 \{出现的最大前缀长度 \verb|len|, \verb|false|\}, 如果出现则返回 \{该串所对应状态 \verb|u|, \verb|true|\} + \item[app 1] 求不同子串个数, 答案即 \verb|sam.st.sz[0] - 1| + \item[app 2] 求每一个 \verb|endpos| 内部串的出现次数, 答案即 \verb|sam.st.times[i]| + \item[app 3] 求每个状态的第一次出现这个状态的末端的位置 \verb|sam.st.firstpos| + + 对于字符串 \verb|t|, 调用 \verb|search(t)| 后, 第一次出现的位置即 \begin{verbatim}sam.st.firstpos[u] - |P| + 1\end{verbatim} + + \verb|t| 的每一个出现位置: 遍历所有以状态 \verb|u| 为后缀的状态 \verb|v|, 答案即 \begin{verbatim}{sam.st.firstpos[v] - |P| + 1}\end{verbatim} + \item[app 4] 求 \verb|s| 与 \verb|t| 的最长公共子串, 其中 \verb|sam| 由 \verb|s| 建立 + \item[app x0] 所有不同子串的总长度, 字典序第 \(k\) 大子串, 最短的没有出现的字符串 (给定字符集): \verb|dp| + \item[app x1] 多个字符串间的最长公共子串, 见 \fullref{sec:广义后缀自动机} +\end{enumerate} \ No newline at end of file diff --git a/src/doc_tex/util/hash_splitmix64.tex b/src/doc_tex/util/hash_splitmix64.tex index 7541c4481..3866f9a0f 100644 --- a/src/doc_tex/util/hash_splitmix64.tex +++ b/src/doc_tex/util/hash_splitmix64.tex @@ -1,4 +1,4 @@ -推荐使用前先设置种子以防被卡, 可用 \verb|std::chrono::steady_clock::now().time_since_epoch().count()| +推荐使用前先设置种子以防被卡, 可用\\\verb|std::chrono::steady_clock::now().time_since_epoch().count()| \paragraph{参考链接}