算法
文章平均质量分 85
算法学习
凌乱之风
ACM蒟蒻
展开
-
生成函数理论
形式幂级数设数列 a0,a1,a2,⋯ ,an,⋯a_0,a_1, a_2,\cdots,a_n,\cdotsa0,a1,a2,⋯,an,⋯ 那么他的形式幂级数就为∑i=0∞aixi\sum_{i = 0}^{\infty}a_ix^ii=0∑∞aixi运算:设 f(x)=∑i=0∞aixi,g(x)=∑i=0∞bixif(x) = \sum_{i = 0}^{\infty}a_ix^i,g(x) = \sum_{i = 0}^{\infty}b_ix^if(x)=∑i=0∞aixi原创 2021-12-08 15:00:43 · 790 阅读 · 0 评论 -
杜教筛
杜教筛杜教筛可以在 O(n23)O(n ^{\frac{2}{3}})O(n32) 的复杂度内求解积性函数的前缀和设数论函数 f(x)f(x)f(x),求∑i=1nf(i)\sum_{i=1}^{n}f(i)i=1∑nf(i)令 S(n)=∑i=1nf(i)S(n) = \sum \limits_{i=1} ^{n} f(i)S(n)=i=1∑nf(i),找一个数论函数 g(x)g(x)g(x) 与 f(x)f(x)f(x) 做卷积∑i=1nf∗g=∑i=1ng∗f\sum_{i=1} ^原创 2021-09-13 10:03:58 · 99 阅读 · 0 评论 -
狄利克雷卷积
定义:对于两个数论函数 f(x),g(x)f(x),g(x)f(x),g(x) 那么它们的卷积 h(x)h(x)h(x) 记作 f(x)∗g(x)f(x) * g(x)f(x)∗g(x),式子如下:f(x)∗g(x)=h(x)=∑d∣nf(d)g(nd)f(x) * g(x) = h(x) = \sum_{d \mid n} f(d)g(\frac{n}{d})f(x)∗g(x)=h(x)=d∣n∑f(d)g(dn)简记为 h=f∗gh = f * gh=f∗g性质:交换律: f∗g=g∗ff原创 2021-09-06 21:06:09 · 386 阅读 · 0 评论 -
计算几何全家桶
二维计算几何#include <bits/stdc++.h>#define x first#define y secondusing namespace std;const int N = 1e5 + 5;const double pi = acos(-1), eps = 1e-8;typedef pair<int, int> PII;typedef pair<double, double> PDD;int sign(double x) { if原创 2021-08-04 08:15:07 · 200 阅读 · 0 评论 -
BSGS、exBSGS
BSGS (Baby Step Giant Step):\text{BSGS (Baby Step Giant Step)}:BSGS (Baby Step Giant Step):给定正整数 a,b,p,a⊥pa,b,p,a \perp pa,b,p,a⊥p ,求满足ax≡b( mod p)a^{x} \equiv b(\text{ mod } p)ax≡b( mod p)的最小非原创 2021-07-25 13:42:59 · 120 阅读 · 0 评论 -
莫比乌斯反演
前置知识1:整除分块①:⌊abc⌋=⌊⌊ab⌋c⌋①:\lfloor \frac{a}{bc} \rfloor = \lfloor \frac{\lfloor \frac{a}{b} \rfloor}{c} \rfloor①:⌊bca⌋=⌊c⌊ba⌋⌋证明:ab=⌊ab⌋+r,r∈[0,1)\frac{a}{b}=\lfloor \frac{a}{b}\rfloor + r,r\in[0,1)ba=⌊ba⌋+r,r∈[0,1)⌊abc⌋=⌊ab⋅1c⌋\lfloor \frac{a}{bc原创 2021-07-22 15:30:23 · 117 阅读 · 0 评论 -
线段树
线段树是用于维护区间信息的一种数据结构,可以在O(logn)O(\log n)O(logn)的复杂度内实现区间修改,区间查询等操作,还可以维护各种满足结合律的信息。原理:线段树的建树:设有数组ai,i∈[1,n]a_i,i \in[1,n]ai,i∈[1,n],把一整个数组区间划分为两个子区间,设区间[l,r][l,r][l,r],那么取区间中点mid=⌊l+r2⌋mid=\left \lfloor \frac{l+r}{2} \right \rfloormid=⌊2l+r⌋,那么区间就会被划分为原创 2021-07-12 21:02:07 · 133 阅读 · 0 评论 -
树状数组笔记
树状数组的基本应用:O(logn)O(\log n)O(logn)单点修改、区间查询原理:设区间[1,R][1,R][1,R],对区间右端点RRR做二进制拆分,有:R=2x1+2x2+⋯+2xkR=2^{x_1}+2^{x_2}+\cdots+2^{x_k}R=2x1+2x2+⋯+2xk假设x1∼xkx_1\sim x_kx1∼xk严格单调递减,那么可以把区间[1,R][1,R][1,R]拆分成logR\log RlogR个区间[1,2x1],[2x1+1,2x1+2x2],⋯ ,原创 2021-07-02 13:52:10 · 87 阅读 · 0 评论 -
tarjan算法求SCC,e-DCC,v-DCC
在介绍算法之前先引入几个概念:时间戳: 在深度优先搜索时,每个点xxx第一次被访问的顺序为时间戳,记作dfn[x]dfn[x]dfn[x](从111开始)追溯值: 从xxx开始走,所能遍历到的最小时间戳,记作low[x]low[x]low[x]1.tarjan1.\text {tarjan}1.tarjan求SCC\text{SCC}SCC给定一张有向图GGG,∀u,v\forall u,v∀u,v,即存在从uuu到vvv的路径又存在从vvv到uuu的路径,那么该图GGG是强连通图。强连通分量(S原创 2021-06-30 15:17:11 · 585 阅读 · 2 评论 -
最近公共祖先(LCA)、树上差分
定义:给定一颗有根树,若节点zzz既是节点xxx的祖先,也是节点yyy的祖先,则称zzz是x,yx,yx,y的公共祖先。在x,yx,yx,y的所有公共祖先种,深度最大的一个称为最近公共祖先,记作LCA(x,y)\text{LCA}(x,y)LCA(x,y)做法一:向上标记法做法二:树上倍增法做法三:tarjan\text{tarjan}tarjan...原创 2021-06-27 20:36:22 · 140 阅读 · 0 评论 -
数位DP(DFS)
由于算法提高课的数位DP的非搜索做法比较难想,所以总结一下数位DP\text{DP}DP的DFS\text{DFS}DFS写法,个人感觉DFS\text{DFS}DFS做法才是数位DP\text{DP}DP的正解。数位DP问题一般给定一个区间[L,R][L,R][L,R],问区间满足的条件的数有多少个。可以利用前缀和来求解答案:∑i=1Ransi−∑i=1L−1ansi\sum_{i=1}^{R} ans_i - \sum_{i=1}^{L - 1} ans_i∑i=1Ransi−∑i=1L−1a原创 2021-06-25 22:19:53 · 549 阅读 · 3 评论 -
(树形DP)最大独立集、最小点覆盖、最小支配集
1.最大独立集\large1.最大独立集1.最大独立集选出最多的点,使得所有点都是不相邻的状态表示:dpi,jdp_{i,j}dpi,j表示以iii为根的树,如果jjj为000,表示不选这个点,如果jjj为111,表示选这个点属性:Max\text{Max}Max状态计算:如果当前点iii不选,那么子节点jjj可以被选或不被选:dpi,0=∑k=1nmax(dpjk,0,dpjk,1)dp_{i,0}=\sum_{k=1}^{n}\max (dp_{j_k,0},dp_{j_k,1})dpi原创 2021-06-02 20:30:49 · 367 阅读 · 0 评论