diff --git a/.gitignore b/.gitignore index 1397609..7b77463 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,5 @@ # latex latex/ !latex/*.tex + +out/ \ No newline at end of file diff --git a/README.md b/README.md index a9b53fa..3e9a8f0 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,15 @@ # AcmTemplates ACM模板 + + + + +### Install Source Code Pro Font + +``` bash +wget https://www.fontsquirrel.com/fonts/download/source-code-pro.zip +sudo unzip source-code-pro.zip -d /usr/share/fonts/opentype +sudo fc-cache -f -v +``` + diff --git a/gen.py b/gen.py index 741e472..385eef2 100644 --- a/gen.py +++ b/gen.py @@ -3,37 +3,6 @@ import re -def scan_files(root_path): - file_pathes = [] - for i,j,k in os.walk(root_path): - for l in k: - path = os.path.join(i,l) - # print(path) - file_pathes.append(path) - return file_pathes - -def read_file(path): - with open(path,"r") as f: - content = f.read() - # print(content) - return content - return None - -def extract_data(content): - pattern = re.compile('---\ntitle: (.*)\nchapter: (.*)\n---\n(.*)',re.DOTALL) - match = re.match(pattern, content) - if match is not None: - # print(match.group(1)) - # print(match.group(2)) - # print(match.group(3)) - section = { - 'title': match.group(1), - 'chapter': match.group(2), - 'code': match.group(3), - } - return section - return None - header = '''\\documentclass[twocolumn,a4,twoside]{book} \\usepackage{xeCJK} \\usepackage{amsmath, amsthm} @@ -62,7 +31,7 @@ def extract_data(content): breaklines = true, captionpos = b, tabsize = 4, - frame = shadowbox, + frame = box, columns = fullflexible, keywordstyle = \\bfseries, basicstyle = \\small\\ttfamily, @@ -73,7 +42,7 @@ def extract_data(content): \\title{\\CJKfamily{hei} {\\bfseries ACM模板}} -\\author{han777404} +\\author{XORSUM} \\renewcommand{\\today}{\\number\\year 年 \\number\\month 月 \\number\\day 日} \\begin{document}\\small @@ -85,39 +54,94 @@ def extract_data(content): \\mainmatter \\pagestyle{fancy}''' -def render_latex(documents): - with open("out.tex","w") as f: - f.write(header) - for chapter,sections in documents.items(): - f.write('\n \\chapter{'+chapter+'}\n') - print("Chapter ",chapter) - for section in sections: - f.write(' \\section{'+section['title']+'}\n') - f.write(' \\begin{lstlisting}\n') - f.write(section['code']) - f.write(' \\end{lstlisting}\n') - print("Section ",section['title']) - f.write('\n') - - f.write('\\end{document}') # footer +def read_file(path): + with open(path,"r") as f: + content = f.read() + # print(content) + return content + return None -if __name__ == '__main__': - print("start") - pathes = scan_files("./src") - documents = {} - for i in pathes: - # print(i) - content = read_file(i) - if content is not None: - section = extract_data(content) - # print(section) +def write_file(path,content): + with open(path,"w") as f: + f.write(content) + return content + return None + + + +def extract_summary(content): + pattern = re.compile('---\nindex: (.*)\ntitle: (.*)\n---',re.DOTALL) + match = re.match(pattern, content) + if match is not None: + summary = { + 'index': match.group(1), + 'title': match.group(2), + } + return summary + return None + +def extract_section(content): + pattern = re.compile('---\nindex: (.*)\ntitle: (.*)\n---\n(.*)\n---\n(.*)',re.DOTALL) + match = re.match(pattern, content) + if match is not None: + section = { + 'index': match.group(1), + 'title': match.group(2), + 'description': match.group(3), + 'code': match.group(4), + } + return section + return None + + + +def scan_source(root_path="./src"): + document = [] + for path in os.listdir(root_path): + path = os.path.join(root_path,path) + if os.path.isfile(path): + continue + summary = os.path.join(path,"summary.md") + if not os.path.exists(summary): + continue + chapter = extract_summary(read_file(summary)) + # print(chapter) + sections = [] + for file in os.listdir(path): + if file == 'summary.md': + continue + file = os.path.join(path,file) + section = extract_section(read_file(file)) if section is not None: - l = documents.get(section['chapter'],[]) - l.append(section) - documents[section['chapter']]=l - # print(documents) - render_latex(documents) + sections.append(section) + sections.sort(key=lambda x:x['index']) + chapter['sections']=sections + document.append(chapter) + document.sort(key=lambda x:x['index']) + return document + +def render_latex(document): + latex = header + for chapter in document: + latex = latex + '\n \\chapter{'+chapter['title']+'}\n' + sections = chapter['sections'] + for section in sections: + latex = latex + ' \\section{'+section['title']+'}\n' + latex = latex + section['description'] + '\n' + latex = latex + ' \\begin{lstlisting}\n' + latex = latex + section['code'] + latex = latex + ' \\end{lstlisting}\n' + print("Section ",section['title']) + latex = latex + '\n' + latex = latex + '\\end{document}' # footer + return latex + +if __name__ == '__main__': + print("start") + document = scan_source() + latex = render_latex(document) + write_file("out/document.tex",latex) print("end") \ No newline at end of file diff --git a/src/datastructure/SegmentTree.cpp b/src/datastructure/SegmentTree.cpp index 8bc0477..1441498 100644 --- a/src/datastructure/SegmentTree.cpp +++ b/src/datastructure/SegmentTree.cpp @@ -1,8 +1,9 @@ --- +index: 1 title: SegmentTree -chapter: DataStructure --- - +segment tree, modify range, query the summary +--- struct STree{ int data[maxn<<2]; diff --git a/src/datastructure/summary.md b/src/datastructure/summary.md new file mode 100644 index 0000000..4ec0a35 --- /dev/null +++ b/src/datastructure/summary.md @@ -0,0 +1,4 @@ +--- +index: 1 +title: DataStructures +--- \ No newline at end of file diff --git a/src/datastructure/treap.cpp b/src/datastructure/treap.cpp index aa13b78..0eb825a 100644 --- a/src/datastructure/treap.cpp +++ b/src/datastructure/treap.cpp @@ -1,6 +1,8 @@ --- +index: 7 title: Treap -chapter: DataStructure +--- +Treap --- // 有封装 diff --git "a/src/datastructure/\346\240\221\347\212\266\346\225\260\347\273\204.cpp" "b/src/datastructure/\346\240\221\347\212\266\346\225\260\347\273\204.cpp" index 9670fd0..94fbe9c 100644 --- "a/src/datastructure/\346\240\221\347\212\266\346\225\260\347\273\204.cpp" +++ "b/src/datastructure/\346\240\221\347\212\266\346\225\260\347\273\204.cpp" @@ -1,6 +1,8 @@ --- -title: TreeArray -chapter: DataStructure +index: 3 +title: Tree Array +--- +st --- typedef long long ll; diff --git "a/src/datastructure/\346\240\221\351\223\276\345\211\226\345\210\206\346\261\202\347\202\271\345\222\214.cpp" "b/src/datastructure/\346\240\221\351\223\276\345\211\226\345\210\206\346\261\202\347\202\271\345\222\214.cpp" index 7078d69..1e433e6 100644 --- "a/src/datastructure/\346\240\221\351\223\276\345\211\226\345\210\206\346\261\202\347\202\271\345\222\214.cpp" +++ "b/src/datastructure/\346\240\221\351\223\276\345\211\226\345\210\206\346\261\202\347\202\271\345\222\214.cpp" @@ -1,8 +1,9 @@ --- -title: SegmentTree -chapter: DataStructure +index: 4 +title: Tree Link Cut +--- +st --- - STree st; ll fa[maxn], dep[maxn], siz[maxn], top[maxn], w[maxn]; vector son[maxn]; diff --git "a/src/datastructure/\346\240\221\351\223\276\345\211\226\345\210\206\346\261\202\350\276\271\345\222\214.cpp" "b/src/datastructure/\346\240\221\351\223\276\345\211\226\345\210\206\346\261\202\350\276\271\345\222\214.cpp" index 803f8b9..6e50955 100644 --- "a/src/datastructure/\346\240\221\351\223\276\345\211\226\345\210\206\346\261\202\350\276\271\345\222\214.cpp" +++ "b/src/datastructure/\346\240\221\351\223\276\345\211\226\345\210\206\346\261\202\350\276\271\345\222\214.cpp" @@ -1,6 +1,8 @@ --- -title: SegmentTree -chapter: DataStructure +index: 5 +title: Tree Link Cut +--- +st --- #include diff --git "a/src/datastructure/\347\272\277\346\256\265\346\240\221.cpp" "b/src/datastructure/\347\272\277\346\256\265\346\240\221.cpp" index 29c314b..9c381a1 100644 --- "a/src/datastructure/\347\272\277\346\256\265\346\240\221.cpp" +++ "b/src/datastructure/\347\272\277\346\256\265\346\240\221.cpp" @@ -1,6 +1,8 @@ --- +index: 6 title: SegmentTree -chapter: DataStructure +--- +st --- diff --git "a/src/datastructure/\347\272\277\346\256\265\346\240\221\345\214\272\351\227\264\345\212\240\346\263\225\344\271\230\346\263\225\346\261\202\345\222\214.cpp" "b/src/datastructure/\347\272\277\346\256\265\346\240\221\345\214\272\351\227\264\345\212\240\346\263\225\344\271\230\346\263\225\346\261\202\345\222\214.cpp" index f8c5322..bd8b3a2 100644 --- "a/src/datastructure/\347\272\277\346\256\265\346\240\221\345\214\272\351\227\264\345\212\240\346\263\225\344\271\230\346\263\225\346\261\202\345\222\214.cpp" +++ "b/src/datastructure/\347\272\277\346\256\265\346\240\221\345\214\272\351\227\264\345\212\240\346\263\225\344\271\230\346\263\225\346\261\202\345\222\214.cpp" @@ -1,6 +1,8 @@ --- +index: 2 title: SegmentTree -chapter: DataStructure +--- +st --- #include diff --git a/src/graph/dijkstra.cpp b/src/graph/dijkstra.cpp index 2c1f480..94235f7 100644 --- a/src/graph/dijkstra.cpp +++ b/src/graph/dijkstra.cpp @@ -1,8 +1,9 @@ --- +index: 1 title: Dijkstra -chapter: Graph --- - +st +--- #include using namespace std; diff --git a/src/graph/lca.cpp b/src/graph/lca.cpp index 6ee2925..a6550ed 100644 --- a/src/graph/lca.cpp +++ b/src/graph/lca.cpp @@ -1,6 +1,8 @@ --- -title: Dijkstra -chapter: Graph +index: 2 +title: lca +--- +st --- typedef long long ll; diff --git a/src/graph/summary.md b/src/graph/summary.md new file mode 100644 index 0000000..83d5eda --- /dev/null +++ b/src/graph/summary.md @@ -0,0 +1,4 @@ +--- +index: 2 +title: Graph +--- \ No newline at end of file diff --git "a/src/graph/\344\270\212\344\270\213\347\225\214\347\275\221\347\273\234\346\265\201.cpp" "b/src/graph/\344\270\212\344\270\213\347\225\214\347\275\221\347\273\234\346\265\201.cpp" index 76b1ee1..16daaf3 100644 --- "a/src/graph/\344\270\212\344\270\213\347\225\214\347\275\221\347\273\234\346\265\201.cpp" +++ "b/src/graph/\344\270\212\344\270\213\347\225\214\347\275\221\347\273\234\346\265\201.cpp" @@ -1,55 +1,54 @@ --- -title: Dijkstra -chapter: Graph +index: 3 +title: Network Flow with Top Bottom --- +其实主要还是自己复习用 -// //其实主要还是自己复习用 +假定读者能够熟练打dinic的板子 -// //假定读者能够熟练打dinic的板子 +有上下界的网络流的核心是”调整”,我们通过一个初始的未必可行的流调整出一个可行流,还可以从可行的未必最大/最小的流调整出最大/最小流. -// 有上下界的网络流的核心是”调整”,我们通过一个初始的未必可行的流调整出一个可行流,还可以从可行的未必最大/最小的流调整出最大/最小流. +另一个常用技巧是有源汇的流和无源汇的流(循环流)的转换.除了无源汇可行流的求解,其他有源汇的上下界网络流都要用到这个技巧. -// 另一个常用技巧是有源汇的流和无源汇的流(循环流)的转换.除了无源汇可行流的求解,其他有源汇的上下界网络流都要用到这个技巧. +无源汇有上下界可行流(也就是循环流) +模型:一个网络,求出一个流,使得每条边的流量必须>=Li且<=Hi,每个点必须满足总流入量=总流出量(流量守恒)(这个流的特点是循环往复,无始无终). -// 无源汇有上下界可行流(也就是循环流) -// 模型:一个网络,求出一个流,使得每条边的流量必须>=Li且<=Hi,每个点必须满足总流入量=总流出量(流量守恒)(这个流的特点是循环往复,无始无终). +这个算法是有上下界网络流算法的基础,只要深刻理解这个算法其他算法也就水到渠成,因此我用大篇幅力图将这个算法的思想和细节阐述清楚. -// 这个算法是有上下界网络流算法的基础,只要深刻理解这个算法其他算法也就水到渠成,因此我用大篇幅力图将这个算法的思想和细节阐述清楚. +可行流算法的核心是将一个不满足流量守恒的初始流调整成满足流量守恒的流. -// 可行流算法的核心是将一个不满足流量守恒的初始流调整成满足流量守恒的流. +流量守恒,即每个点的总流入量=总流出量 -// 流量守恒,即每个点的总流入量=总流出量 +如果存在一个可行流,那么一定满足每条边的流量都大于等于流量的下限.因此我们可以令每条边的流量等于流量下限,得到一个初始流,然后建出这个流的残量网络.(即:每条边的流量等于这条边的流量上限与流量下限之差)这个初始流不一定满足流量守恒,因此最终的可行流一定是在这个初始流的基础上增大了一些边的流量使得所有点满足流量守恒. -// 如果存在一个可行流,那么一定满足每条边的流量都大于等于流量的下限.因此我们可以令每条边的流量等于流量下限,得到一个初始流,然后建出这个流的残量网络.(即:每条边的流量等于这条边的流量上限与流量下限之差)这个初始流不一定满足流量守恒,因此最终的可行流一定是在这个初始流的基础上增大了一些边的流量使得所有点满足流量守恒. +因此我们考虑在残量网络上求出一个另不满足流量守恒的附加流,使得这个附加流和我们的初始流合并之后满足流量守恒.即: -// 因此我们考虑在残量网络上求出一个另不满足流量守恒的附加流,使得这个附加流和我们的初始流合并之后满足流量守恒.即: +如果某个点在所有边流量等于下界的初始流中满足流量守恒,那么这个点在附加流中也满足流量守恒, -// 如果某个点在所有边流量等于下界的初始流中满足流量守恒,那么这个点在附加流中也满足流量守恒, +如果某个点在初始流中的流入量比流出量多x,那么这个点在附加流中的流出量比流入量多x. -// 如果某个点在初始流中的流入量比流出量多x,那么这个点在附加流中的流出量比流入量多x. +如果某个点在初始流中的流入量比流出量少x,那么这个点在附加流中的流出量比流入量少x. -// 如果某个点在初始流中的流入量比流出量少x,那么这个点在附加流中的流出量比流入量少x. + 可以认为附加流中一条从u到v的边上的一个流量代表将原图中u到v的流量增大1 -// 可以认为附加流中一条从u到v的边上的一个流量代表将原图中u到v的流量增大1 +X的数值可以枚举x的所有连边求出.比较方便的写法是开一个数组A[],A[i]表示i在初始流中的流入量-流出量的值,那么A[i]的正负表示流入量和流出量的大小关系,下面就用A[i]表示初始流中i的流入量-流出量 -// X的数值可以枚举x的所有连边求出.比较方便的写法是开一个数组A[],A[i]表示i在初始流中的流入量-流出量的值,那么A[i]的正负表示流入量和流出量的大小关系,下面就用A[i]表示初始流中i的流入量-流出量 +但是dinic算法能够求的是满足流量守恒的有源汇最大流,不能在原网络上直接求一个这样的无源汇且不满足流量守恒的附加流.注意到附加流是在原网络上不满足流量守恒的,这启发我们添加一些原网络之外的边和点,用这些边和点实现”原网络上流量不守恒”的限制. -// 但是dinic算法能够求的是满足流量守恒的有源汇最大流,不能在原网络上直接求一个这样的无源汇且不满足流量守恒的附加流.注意到附加流是在原网络上不满足流量守恒的,这启发我们添加一些原网络之外的边和点,用这些边和点实现”原网络上流量不守恒”的限制. +具体地,如果一个点i在原网络上的附加流中需要满足流入量>流出量(初始流中流入量<流出量,A[i]<0),那么我们需要给多的流入量找一个去处,因此我们建一条从i出发流量=-A[i]的边.如果A[i]>0,也就是我们需要让附加流中的流出量>流入量,我们需要让多的流出量有一个来路,因此我们建一条指向i的流量=A[i]的边. -// 具体地,如果一个点i在原网络上的附加流中需要满足流入量>流出量(初始流中流入量<流出量,A[i]<0),那么我们需要给多的流入量找一个去处,因此我们建一条从i出发流量=-A[i]的边.如果A[i]>0,也就是我们需要让附加流中的流出量>流入量,我们需要让多的流出量有一个来路,因此我们建一条指向i的流量=A[i]的边. +当然,我们所新建的从i出发的边也要有个去处,指向i的边也要有个来路,因此我们新建一个虚拟源点ss和一个虚拟汇点tt(双写字母是为了和有源汇网络流中的源点s汇点t相区分).新建的指向i的边都从ss出发,从i出发的边都指向tt.一个点要么有一条边指向tt,要么有一条边来自ss, -// 当然,我们所新建的从i出发的边也要有个去处,指向i的边也要有个来路,因此我们新建一个虚拟源点ss和一个虚拟汇点tt(双写字母是为了和有源汇网络流中的源点s汇点t相区分).新建的指向i的边都从ss出发,从i出发的边都指向tt.一个点要么有一条边指向tt,要么有一条边来自ss, +指向tt的边的总流量上限一定等于ss流出的边的总流量上限,因为每一条边对两个点的A[i]贡献一正一负大小相等,所以全部点的A[i]之和等于0,即小于0的A[i]之和的绝对值=大于0的A[i]之和的绝对值. -// 指向tt的边的总流量上限一定等于ss流出的边的总流量上限,因为每一条边对两个点的A[i]贡献一正一负大小相等,所以全部点的A[i]之和等于0,即小于0的A[i]之和的绝对值=大于0的A[i]之和的绝对值. +如果我们能找到一个流满足新加的边都满流,这个流在原图上的部分就是我们需要的附加流(根据我们的建图方式,“新加的边都满流”和”附加流合并上初始流得到流量平衡的流”是等价的约束条件). -// 如果我们能找到一个流满足新加的边都满流,这个流在原图上的部分就是我们需要的附加流(根据我们的建图方式,“新加的边都满流”和”附加流合并上初始流得到流量平衡的流”是等价的约束条件). +那么怎样找出一个新加的边都满流的流呢?可以发现假如存在这样的方案,这样的流一定是我们所建出的图的ss-tt最大流,所以跑ss到tt的最大流即可.如果最大流的大小等于ss出发的所有边的流量上限之和(此时指向tt的边也一定满流,因为这两部分边的流量上限之和相等). -// 那么怎样找出一个新加的边都满流的流呢?可以发现假如存在这样的方案,这样的流一定是我们所建出的图的ss-tt最大流,所以跑ss到tt的最大流即可.如果最大流的大小等于ss出发的所有边的流量上限之和(此时指向tt的边也一定满流,因为这两部分边的流量上限之和相等). - -// 最后,每条边在可行流中的流量=容量下界+附加流中它的流量(即跑完dinic之后所加反向边的权值). - -// 代码(ZOJ2314 Reactor Cooling) +最后,每条边在可行流中的流量=容量下界+附加流中它的流量(即跑完dinic之后所加反向边的权值). +代码(ZOJ2314 Reactor Cooling) +--- #include #include #include diff --git "a/src/graph/\346\234\200\345\244\247\346\265\201.cpp" "b/src/graph/\346\234\200\345\244\247\346\265\201.cpp" index 9859ac9..8fa9c60 100644 --- "a/src/graph/\346\234\200\345\244\247\346\265\201.cpp" +++ "b/src/graph/\346\234\200\345\244\247\346\265\201.cpp" @@ -1,6 +1,8 @@ --- -title: Dijkstra -chapter: Graph +index: 4 +title: Max Flow +--- +st --- #include diff --git "a/src/graph/\346\234\200\345\260\217\350\264\271\347\224\250\346\265\201.cpp" "b/src/graph/\346\234\200\345\260\217\350\264\271\347\224\250\346\265\201.cpp" index dc60c4e..7f23427 100644 --- "a/src/graph/\346\234\200\345\260\217\350\264\271\347\224\250\346\265\201.cpp" +++ "b/src/graph/\346\234\200\345\260\217\350\264\271\347\224\250\346\265\201.cpp" @@ -1,6 +1,8 @@ --- -title: Dijkstra -chapter: Graph +index: 6 +title: Min Cost Max Flow +--- +st --- #include diff --git "a/src/graph/\346\254\241\347\237\255\350\267\257.cpp" "b/src/graph/\346\254\241\347\237\255\350\267\257.cpp" index af23683..8748f0a 100644 --- "a/src/graph/\346\254\241\347\237\255\350\267\257.cpp" +++ "b/src/graph/\346\254\241\347\237\255\350\267\257.cpp" @@ -1,10 +1,9 @@ --- -title: Dijkstra -chapter: Graph +index: 7 +title: Second Shortest Route +--- +那么我们现在先回忆下Dijkstra是怎么求解最短路问题的。Dijkstra的思想是根据确定最短路的顶点来计算尚未确定顶点的最短路,这句话是什么意思呢?比如在一幅无向图中,s为源点,v1为已经确定最短路的顶点,v2,v3为尚未确定的顶点。那么我们使用v1的最短距离加上v1->v2或v3的距离,来更新v2,v3到源点s的距离。显然这么一直更新下去,那么最终s到v2,v3的距离就是最短距离(详情请参考:Here)。如果dist[v]表示s->v的最短距离,dist2[v]表示s->v的次短距离,d为s->v的第k短距离(k>1)。那么一定满足这样一个关系,dist[v] < dist2[v] <= k。看到这个等式的时候我们可以发现,如果dist2[v] > d2 > dist[v],显然这时候我们需要将dist2[v]更新为d2。那么我们只要找到不满足dist[v] < dist2[v] <= k这个的式子的dist2[v],那么我们就更新他。一直更新到所以式子都满足这个式子,那么dist2[v]就为源点s->v的次短路。到此我们已经推出了求解次短路的方法。 --- - -// 那么我们现在先回忆下Dijkstra是怎么求解最短路问题的。Dijkstra的思想是根据确定最短路的顶点来计算尚未确定顶点的最短路,这句话是什么意思呢?比如在一幅无向图中,s为源点,v1为已经确定最短路的顶点,v2,v3为尚未确定的顶点。那么我们使用v1的最短距离加上v1->v2或v3的距离,来更新v2,v3到源点s的距离。显然这么一直更新下去,那么最终s到v2,v3的距离就是最短距离(详情请参考:Here)。如果dist[v]表示s->v的最短距离,dist2[v]表示s->v的次短距离,d为s->v的第k短距离(k>1)。那么一定满足这样一个关系,dist[v] < dist2[v] <= k。看到这个等式的时候我们可以发现,如果dist2[v] > d2 > dist[v],显然这时候我们需要将dist2[v]更新为d2。那么我们只要找到不满足dist[v] < dist2[v] <= k这个的式子的dist2[v],那么我们就更新他。一直更新到所以式子都满足这个式子,那么dist2[v]就为源点s->v的次短路。到此我们已经推出了求解次短路的方法。 - #include #include #include diff --git a/src/math/BSGS.cpp b/src/math/BSGS.cpp index be1c88b..72432b6 100644 --- a/src/math/BSGS.cpp +++ b/src/math/BSGS.cpp @@ -1,10 +1,13 @@ - -// BSGS,就是平常所说的大步小步算法, 求出形如同余方程Ax≡B(mod C)(C是质数)的解。 -// 我们可以使用分块来优化暴力枚举,对于Ax≡B(mod C),我们可以令n=sqrt(C),x=i∗n+j, -// 那么该式子就可以写成A^(i∗n)∗A^j ≡ B(mod C),于是我们可以将A^j进行预处理, -// 表示达到这个值的指数项为多少,存到一个哈希表或者map里, -// 之后我们只要枚举A^(i∗n)就行了,大致复杂度是O(sqrt(n)*log(n))。 - +--- +index: 1 +title: BSGS +--- +BSGS,就是平常所说的大步小步算法, 求出形如同余方程$Ax≡B(mod C)$(C是质数)的解。 +我们可以使用分块来优化暴力枚举,对于$Ax≡B(mod C)$,我们可以令$n=sqrt(C),x=i∗n+j$, +那么该式子就可以写成$A^(i∗n)∗A^j ≡ B(mod C)$,于是我们可以将$A^j$进行预处理, +表示达到这个值的指数项为多少,存到一个哈希表或者map里, +之后我们只要枚举$A^(i∗n)$就行了,大致复杂度是$O(sqrt(n)*log(n))$。 +--- typedef long long ll; ll qpow(ll a,ll x,ll mod) { diff --git a/src/math/Sqrt.java b/src/math/Sqrt.java index a073785..63e3b55 100644 --- a/src/math/Sqrt.java +++ b/src/math/Sqrt.java @@ -1,3 +1,10 @@ +--- +index: 3 +title: sqrt for java +--- +st +--- + public static BigInteger sqrt(BigInteger x) { BigInteger l = BigInteger.ZERO, r = BigInteger.valueOf(2); diff --git a/src/math/summary.md b/src/math/summary.md new file mode 100644 index 0000000..d766b6d --- /dev/null +++ b/src/math/summary.md @@ -0,0 +1,4 @@ +--- +index: 3 +title: Math +--- \ No newline at end of file diff --git "a/src/math/\344\270\255\345\233\275\345\211\251\344\275\231\345\256\232\347\220\206.cpp" "b/src/math/\344\270\255\345\233\275\345\211\251\344\275\231\345\256\232\347\220\206.cpp" index c91f287..f7b7612 100644 --- "a/src/math/\344\270\255\345\233\275\345\211\251\344\275\231\345\256\232\347\220\206.cpp" +++ "b/src/math/\344\270\255\345\233\275\345\211\251\344\275\231\345\256\232\347\220\206.cpp" @@ -1,3 +1,9 @@ +--- +index: 2 +title: crt +--- +st +--- #include #include #include diff --git "a/src/math/\345\277\253\351\200\237\345\271\202.cpp" "b/src/math/\345\277\253\351\200\237\345\271\202.cpp" index 5f08132..6b239cb 100644 --- "a/src/math/\345\277\253\351\200\237\345\271\202.cpp" +++ "b/src/math/\345\277\253\351\200\237\345\271\202.cpp" @@ -1,4 +1,9 @@ - +--- +index: 4 +title: quick sort +--- +st +--- ll qpow(ll a,ll x){ ll ret=1; diff --git "a/src/math/\346\234\254\345\216\237\345\213\276\350\202\241\346\225\260\346\240\221.cpp" "b/src/math/\346\234\254\345\216\237\345\213\276\350\202\241\346\225\260\346\240\221.cpp" index 9107550..b356a06 100644 --- "a/src/math/\346\234\254\345\216\237\345\213\276\350\202\241\346\225\260\346\240\221.cpp" +++ "b/src/math/\346\234\254\345\216\237\345\213\276\350\202\241\346\225\260\346\240\221.cpp" @@ -1,3 +1,10 @@ +--- +index: 5 +title: gougu +--- +st +--- + #include typedef long long ll; diff --git "a/src/math/\346\254\247\346\213\211\345\207\275\346\225\260phi.cpp" "b/src/math/\346\254\247\346\213\211\345\207\275\346\225\260phi.cpp" index 4e25cf1..9dfcaf9 100644 --- "a/src/math/\346\254\247\346\213\211\345\207\275\346\225\260phi.cpp" +++ "b/src/math/\346\254\247\346\213\211\345\207\275\346\225\260phi.cpp" @@ -1,3 +1,9 @@ +--- +index: 6 +title: eulur function +--- +st +--- // 单个 ll Euler(ll n) { ll ret=n; diff --git "a/src/math/\346\254\247\346\213\211\347\264\240\346\225\260\347\255\233.cpp" "b/src/math/\346\254\247\346\213\211\347\264\240\346\225\260\347\255\233.cpp" index 9828d65..4a5b26b 100644 --- "a/src/math/\346\254\247\346\213\211\347\264\240\346\225\260\347\255\233.cpp" +++ "b/src/math/\346\254\247\346\213\211\347\264\240\346\225\260\347\255\233.cpp" @@ -1,4 +1,9 @@ - +--- +index: 7 +title: prime +--- +st +--- const int maxn = 1000010; ll prime[maxn], notPrime[maxn], priCnt=0; diff --git "a/src/math/\347\237\251\351\230\265\345\277\253\351\200\237\345\271\202.cpp" "b/src/math/\347\237\251\351\230\265\345\277\253\351\200\237\345\271\202.cpp" index 89c664a..784ccb9 100644 --- "a/src/math/\347\237\251\351\230\265\345\277\253\351\200\237\345\271\202.cpp" +++ "b/src/math/\347\237\251\351\230\265\345\277\253\351\200\237\345\271\202.cpp" @@ -1,3 +1,9 @@ +--- +index: 8 +title: quick pow of matrix +--- +st +--- const ll mod = 10000; const int MATRX_SIZE = 2; struct Matrx{ diff --git "a/src/math/\347\261\263\345\213\222\347\275\227\345\256\276\347\264\240\346\225\260\346\265\213\350\257\225.cpp" "b/src/math/\347\261\263\345\213\222\347\275\227\345\256\276\347\264\240\346\225\260\346\265\213\350\257\225.cpp" index 4db8ca1..983d817 100644 --- "a/src/math/\347\261\263\345\213\222\347\275\227\345\256\276\347\264\240\346\225\260\346\265\213\350\257\225.cpp" +++ "b/src/math/\347\261\263\345\213\222\347\275\227\345\256\276\347\264\240\346\225\260\346\265\213\350\257\225.cpp" @@ -1,3 +1,10 @@ +--- +index: 9 +title: Miller Rabin +--- +st +--- + // 18位素数:154590409516822759 // 19位素数:2305843009213693951 (梅森素数) // 19位素数:4384957924686954497 diff --git "a/src/math/\347\273\204\345\220\210\346\225\260.cpp" "b/src/math/\347\273\204\345\220\210\346\225\260.cpp" index d83ac92..76dd791 100644 --- "a/src/math/\347\273\204\345\220\210\346\225\260.cpp" +++ "b/src/math/\347\273\204\345\220\210\346\225\260.cpp" @@ -1,4 +1,9 @@ - +--- +index: 10 +title: combination +--- +st +--- /////////////////// typedef long long ll; diff --git "a/src/math/\350\256\241\347\256\227\346\225\260\345\255\227 X \345\234\250 1-n \344\270\255\345\207\272\347\216\260\347\232\204\346\254\241\346\225\260.cpp" "b/src/math/\350\256\241\347\256\227\346\225\260\345\255\227 X \345\234\250 1-n \344\270\255\345\207\272\347\216\260\347\232\204\346\254\241\346\225\260.cpp" index 9778e76..e48e461 100644 --- "a/src/math/\350\256\241\347\256\227\346\225\260\345\255\227 X \345\234\250 1-n \344\270\255\345\207\272\347\216\260\347\232\204\346\254\241\346\225\260.cpp" +++ "b/src/math/\350\256\241\347\256\227\346\225\260\345\255\227 X \345\234\250 1-n \344\270\255\345\207\272\347\216\260\347\232\204\346\254\241\346\225\260.cpp" @@ -1,4 +1,9 @@ -// 计算数字 X 在 1-n 中出现的次数。 +--- +index: 11 +title: Count +--- +计算数字 X 在 1-n 中出现的次数。 +--- int count(int n, int x) { int cnt = 0, k; for (int i = 1;k = n / i;i *= 10) { diff --git "a/src/math/\351\235\222\350\233\231\347\232\204\347\272\246\344\274\232.cpp" "b/src/math/\351\235\222\350\233\231\347\232\204\347\272\246\344\274\232.cpp" index 3602e57..8424849 100644 --- "a/src/math/\351\235\222\350\233\231\347\232\204\347\272\246\344\274\232.cpp" +++ "b/src/math/\351\235\222\350\233\231\347\232\204\347\272\246\344\274\232.cpp" @@ -1,4 +1,10 @@ -#include +--- +index: 13 +title: Frog +--- +Frog +--- +include #include #include #include diff --git a/src/others/FastIO.cpp b/src/others/FastIO.cpp index c90ad58..b8681df 100644 --- a/src/others/FastIO.cpp +++ b/src/others/FastIO.cpp @@ -1,3 +1,9 @@ +--- +index: 1 +title: Fast IO +--- +Fast IO +--- namespace FastIO { const int SIZE = 1 << 16; char buf[SIZE], str[64]; diff --git a/src/others/header.cpp b/src/others/header.cpp index db91087..f691758 100644 --- a/src/others/header.cpp +++ b/src/others/header.cpp @@ -1,3 +1,9 @@ +--- +index: 2 +title: Header +--- +Header +--- /****************************************** * Author : wshek * Created On : Thu Nov 23 2017 diff --git a/src/others/summary.md b/src/others/summary.md new file mode 100644 index 0000000..99ef4f9 --- /dev/null +++ b/src/others/summary.md @@ -0,0 +1,4 @@ +--- +index: 6 +title: Others +--- \ No newline at end of file diff --git "a/src/others/\345\207\270\345\214\205\346\227\213\350\275\254\345\215\241\345\243\263.cpp" "b/src/others/\345\207\270\345\214\205\346\227\213\350\275\254\345\215\241\345\243\263.cpp" index 38faf7b..d7f47da 100644 --- "a/src/others/\345\207\270\345\214\205\346\227\213\350\275\254\345\215\241\345\243\263.cpp" +++ "b/src/others/\345\207\270\345\214\205\346\227\213\350\275\254\345\215\241\345\243\263.cpp" @@ -1,3 +1,9 @@ +--- +index: 2 +title: tubao +--- +tubao +--- #include #include #include diff --git "a/src/others/\346\234\200\350\277\234\346\233\274\345\223\210\351\241\277\350\267\235\347\246\273.cpp" "b/src/others/\346\234\200\350\277\234\346\233\274\345\223\210\351\241\277\350\267\235\347\246\273.cpp" index 04c9afa..1312aa4 100644 --- "a/src/others/\346\234\200\350\277\234\346\233\274\345\223\210\351\241\277\350\267\235\347\246\273.cpp" +++ "b/src/others/\346\234\200\350\277\234\346\233\274\345\223\210\351\241\277\350\267\235\347\246\273.cpp" @@ -1,3 +1,9 @@ +--- +index: 4 +title: Longest Manhadun +--- +Header +--- const int maxn = 200005; ll a[maxn][7]; diff --git "a/src/others/\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.cpp" "b/src/others/\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.cpp" index 3e96109..14fd355 100644 --- "a/src/others/\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.cpp" +++ "b/src/others/\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.cpp" @@ -1,3 +1,9 @@ +--- +index: 5 +title: Longest Up +--- +Header +--- #include using namespace std; diff --git "a/src/string/AC\350\207\252\345\212\250\346\234\272.cpp" "b/src/string/AC\350\207\252\345\212\250\346\234\272.cpp" index 24c0e18..3eaa4d0 100644 --- "a/src/string/AC\350\207\252\345\212\250\346\234\272.cpp" +++ "b/src/string/AC\350\207\252\345\212\250\346\234\272.cpp" @@ -1,7 +1,14 @@ -// Keywords Search -// 网络流上流传最广的AC自动机模板题,问你目标串中出现了几个模式串 -// 如果一个结点是单词末尾的话out标记为true,在search的时候对于每个结点都向fail指针找 -// 找到out为true的就将其标记为false,且ans++ +--- +index: 2 +title: AC自动机 +--- +AC自动机 +Keywords Search +网络流上流传最广的AC自动机模板题,问你目标串中出现了几个模式串 +如果一个结点是单词末尾的话out标记为true,在search的时候对于每个结点都向fail指针找 +找到out为true的就将其标记为false,且ans++ +--- + #include #include #include diff --git a/src/string/kmp.cpp b/src/string/kmp.cpp index 23fd358..3bc7d39 100644 --- a/src/string/kmp.cpp +++ b/src/string/kmp.cpp @@ -1,3 +1,9 @@ +--- +index: 1 +title: kmp +--- +kmp +--- const ll maxn = 1000006; int Next[maxn]; char str[maxn]; diff --git a/src/string/summary.md b/src/string/summary.md new file mode 100644 index 0000000..b77ef02 --- /dev/null +++ b/src/string/summary.md @@ -0,0 +1,4 @@ +--- +index: 5 +title: String +--- \ No newline at end of file