
OI
文章平均质量分 76
seh_sjlj
一个热爱数学证明的大学牲
展开
-
【算法/数论】欧拉筛法详解:过程详述、正确性证明、复杂度证明
文章目录一、什么是筛法二、欧拉筛法详解三、欧拉筛法正确性的证明四、时间复杂度的证明一、什么是筛法筛法就是求出小于等于nnn的素数的方法,在数论中发挥着很大的作用。二、欧拉筛法详解筛法做到复杂度优化,所采用的一个惯用思路是:找到一个素数后,就将它的倍数标记为合数,也就是把它们“筛掉”;如果一个数没有被比它小的素数“筛掉”,那它就是素数。欧拉筛法的大致思路也是如此,就是其中有些细节有差异。欧拉筛法拥有线性的复杂度,而且编码较简单,应用十分广泛。我们先给出代码:bool isprime[MAXN];原创 2022-03-19 00:39:08 · 50613 阅读 · 26 评论 -
【算法/图论】2-SAT问题详解
要求出强连通分量,就需要对原图进行缩点,顺便可以求出得到的有向无环图的拓扑序。数组存储每个节点的染色,实际上就是有向无环图的逆拓扑序(因为在DFS树中越深的节点越先被染色)。没有出现某个变量及其否定在同一个强连通分量的情况,所以是可满足的。...原创 2022-08-02 16:18:19 · 7731 阅读 · 4 评论 -
KMP算法详解
KMP算法虽然代码简单,但是理解起来还是颇为费力的,细节很多。包括next数组和k = next[k]等都是理解上的难点。所以我花了一个星期时间整理了这样一篇文章,从暴力算法开始到next数组和匹配过程,以及时间复杂度的证明和例题,希望能够完整地展示KMP算法的全貌,深入浅出地阐述KMP算法的思想。原创 2022-04-13 11:03:22 · 1953 阅读 · 0 评论 -
【算法/数论】埃拉托斯特尼筛法时间复杂度的证明
文章目录一、埃拉托斯特尼筛法简介二、黎曼ζ\zetaζ函数与欧拉乘积公式三、问题求解一、埃拉托斯特尼筛法简介埃拉托斯特尼筛法(Sieve of Eratosthenes)是一种能快速求出1∼n1\sim n1∼n内所有质数的方法。埃拉托斯特尼就是用很聪明的方法测出地球周长的那个希腊人。算法的过程是:枚举1∼n1\sim n1∼n中的每个数iii,如果它没有被前面的数标记过,则iii为质数,此时标记它的2,3,4⋯2,3,4\cdots2,3,4⋯倍为合数。C++代码如下:bool isprime[MA原创 2022-03-29 19:56:51 · 4800 阅读 · 5 评论 -
洛谷P7918 【洛谷月赛LGR-096 Div.2 T2】 [Kubic] Lines题解
这道题是普及-,结果我比赛时想了整整一个小时。。。果然我还是太菜了啊QAQ题目大意解题思路佬曰:“有人看到这道题直接网络流。”其实不用网络流。题目中最关键的一句话其实是注意:输入数据不保证gcd(a,b)=1\gcd(a,b)=1gcd(a,b)=1。真是一语点醒梦中人。事实上,我们需要充分利用aaa,bbb是整数的条件。两条直线aix+biy+ci=0a_ix+b_iy+c_i=0aix+biy+ci=0与ajx+bjy+cj=0a_jx+b_jy+c_j=0ajx+bj原创 2021-11-01 08:44:39 · 232 阅读 · 0 评论 -
洛谷P7917 【洛谷月赛LGR-096 Div.2 T1】 [Kubic] Addition题解
这道题真是让我深刻地陷入了对我智商的怀疑。。。比赛想了50min,结果最后评出来难度是过分了啊。。。题目大意解题思路贪心。可以看出,每个数aia_iai对答案的贡献是±ai\pm a_i±ai。那么我们尽量让每个数的贡献为其绝对值。又注意到a1a_1a1的贡献永远是a1a_1a1本身(因为没有哪个数能减它)。那么,最优解就是a1+∑i=2n∣ai∣a_1+\sum \limits_{i=2}^n|a_i|a1+i=2∑n∣ai∣。下面证明最优解一定可以构造出来。考虑从右往左合并原创 2021-11-01 08:05:54 · 394 阅读 · 0 评论 -
浅谈单调队列的性质
性质1:单调性队列中的元素必须满足单调性。如果要求区间最大值,则队列单调递减;否则队列单调递增。即:队首就是要求的元素。性质2:有序性事实上,元素在原序列中的相对位置和在队列中的相对位置不变。代码一个递增(求最小值)的单调队列:int head = 1, tail = 0;for(int i = 1; i <= n; ++i){ while(tail >= head && q[tail] >= a[i]) --tail; q[原创 2021-09-23 10:44:23 · 357 阅读 · 0 评论 -
BFS、SPFA、Dijkstra算法中vis数组的用法对比
先上代码:BFS:Dijkstra:struct node{ int u, ds; friend bool operator<(const node& n1, const node& n2) { return n1.ds > n2.ds; }};bool vis[MAXN];int dis[MAXN];void Dijkstra(int s){ memset(dis, 0x3f, sizeo原创 2021-09-15 19:54:50 · 1703 阅读 · 0 评论 -
洛谷P2392 kkksc03临时抱佛脚 题解
链接https://www.luogu.com.cn/problem/P2392正解打眼一看,这道题有个标签。好啊,贪就贪呗。贪心策略:对于某道题,目前哪边脑子花的时间少就用那边。交上去:0分。问题出在哪了呢?举个Hack数据:2 1 100 2按照我们的策略,答案是101。可是明明可以左脑算100,右脑算2+1+2。答案是100。如果考场上想不出来Hack数据怎么办呢?那就尝试用数学归纳法证明我们的贪心策略的正确性。① 当n=0、n=1、n=2时.原创 2021-09-11 16:57:50 · 347 阅读 · 0 评论 -
Tarjan求割点和Tarjan求SCC代码对比
求SCC:void Tarjan(int u){ low[u] = dfn[u] = ++tot; stk.push(u); for(int e = first[u]; e; e = nxt[e]) { int v = go[e]; if(!dfn[v]) { Tarjan(v); low[u] = min(low[u], low[v]); }原创 2021-08-27 09:20:10 · 181 阅读 · 0 评论 -
Tarjan算法超超超详解(ACM/OI)(强连通分量/缩点)(图论)(C++)
深入浅出的Tarjan算法手把手讲解!看完就会!原创 2021-08-24 15:20:52 · 13086 阅读 · 21 评论 -
树状数组中的数学
本文利用数学详细地证明了树状数组的合理性,可以加深对树状数组的理解。原创 2021-08-15 13:27:54 · 174 阅读 · 0 评论 -
[NOIP 2004 提高组] 合并果子:贪心思想数学证明
贪心思想每次合并两堆最小的,直到只剩一堆为止。数学证明(归纳法)假设我们有堆果子:。设花费为。① 最开始,我们必定要合并两堆最小的(),因为此时可以使花费最小()。② 假设我们只剩下堆了(),且到此时花费仍为最小。那么我们仍需要合并两堆最小的,设新增花费为,则最小。因此当合并成一堆时最小。即:最小。...原创 2021-08-14 11:03:17 · 272 阅读 · 0 评论 -
洛谷P2882 [USACO07MAR]Face The Right Way G 贪心思想的数学证明
题目题目描述Farmer John has arranged his N (1 ≤ N ≤ 5,000) cows in a row and many of them are facing forward, like good cows. Some of them are facing backward, though, and he needs them all to face forward to make his life perfect.Fortunately, FJ recently原创 2021-08-12 09:59:01 · 312 阅读 · 0 评论 -
01背包的滚动数组优化:数学证明
我有一个毛病,一个算法要是没有数学证明我很难接受它。即使背过的代码也就忘了。就像今天要讲的01背包的滚动数组,我还是推出了数学证明才把它背下来了。题目:洛谷 P1048 [NOIP2005 普及组] 采药01背包先上代码:// 最简单的01背包#if 0 // 没有优化,n^2#include <iostream>#include <algorithm>using namespace std;int T, M;int t[105], v[105],.原创 2021-07-21 14:31:01 · 169 阅读 · 0 评论 -
洛谷P2169(正则表达式)题解(不用Tarjan)
看到洛谷P2169有一道julao(一看就是标题党)出的题目,考察缩点+最短路。很多julao用了Tarjan+重新建图,但是本蒟蒻所用的Kosaraju算法不需要重新建图,只需要把在同一强连通分量内的每一条边边权改为零即可。#pragma GCC optimize(2)#include<iostream>#include<cstring>#include&...原创 2020-04-27 08:02:44 · 332 阅读 · 0 评论