随笔分类 -  算法竞赛

摘要:快速Walsh变换 给两个长度为 \(n\) 的序列 \(a,b\) ,满足 \(n=2^k\) ,序列标号为 \(a_0,a_1,\cdots,a_{n-1}\) , 求AND卷积: 序列 \(c\) ,满足 \(c_i=\sum\limits_{(j\&k)=i}a_j\cdot b_k\) 求 阅读全文
posted @ 2021-02-05 18:59 purinliang 阅读(354) 评论(0) 推荐(0)
摘要:const int MAXN = 2e5 + 10; vector<int> G[MAXN]; int dis[MAXN], mxdis; void dfs(int u, int p) { dis[u] = dis[p] + 1; if(dis[u] > dis[mxdis]) mxdis = u; 阅读全文
posted @ 2021-02-03 22:44 purinliang 阅读(82) 评论(0) 推荐(0)
摘要:不打开O2的话效率不够高,但是这种程度上的优化确实应该留给编译器去做了,学个计算机假如连编译器能做的优化都要手动去做并且牺牲程序的简洁性,那还是早点改行去工地搬砖吧。 const int MAXLOGN = 20; const int MAXN = 1 << MAXLOGN; const int M 阅读全文
posted @ 2021-02-01 16:59 purinliang 阅读(89) 评论(0) 推荐(0)
摘要:把正整数n分成若干个正整数之和的方法数。 http://www.51nod.com/Challenge/Problem.html#problemId=1259 动态规划 答案是g[n] const int MAXF = 1e3 + 10; const int MAXG = 2e5 + 10; int 阅读全文
posted @ 2021-01-31 03:07 purinliang 阅读(150) 评论(0) 推荐(0)
摘要:斯特林子集数/第二类斯特林数 从把n个不同的小球放到k个相同的盒子里,且每个盒子至少要有一个小球的选法。 快速计算一行斯特林数: 使用这个式子 \({n \brace m} = \frac{1}{m!} \sum\limits_{i=0}^m (-1)^i \binom {m}{i} (m-i)^n 阅读全文
posted @ 2021-01-30 15:13 purinliang 阅读(254) 评论(0) 推荐(0)
摘要:边 \((u,v)\) 表示 u 的拓扑序在 v 之前。 因为是先从入度为0的点开始消。 struct Graph { static const int MAXN = 2e5 + 10; int n; vector<int> eout[MAXN]; int din[MAXN]; int topo[M 阅读全文
posted @ 2021-01-30 01:48 purinliang 阅读(53) 评论(0) 推荐(0)
摘要:多项式加减乘法 \[ h1(x)=\sum\limits_{i=0}^{n1-1}h_{1i}\cdot x^i; \forall i \ge n1, h1_{i} = 0.\\ h2(x)=\sum\limits_{i=0}^{n2-1}h_{2i}\cdot x^i; \forall i \ge 阅读全文
posted @ 2021-01-29 15:00 purinliang 阅读(515) 评论(0) 推荐(0)
摘要:序列 \(a=[a_0,a_1,a_2,a_3,a_4,...]\) 的普通型生成函数,定义为形式幂级数: \(F(x)=\sum\limits_{i=0}^{n}a_ix^i\) 。 若序列 \(a\) 拥有通项公式,那么 \(a_i\) 就等于通项公式。 再设 \(G(x)=\sum\limit 阅读全文
posted @ 2021-01-28 14:55 purinliang 阅读(233) 评论(0) 推荐(0)
摘要:最长上升子序列 const int MAXN = 2e5 + 10; int n, a[MAXN], dp[MAXN]; int LIS1() { memset(dp, INF, sizeof(dp[0]) * (n + 1)); for(int i = 1; i <= n; ++i) *lower 阅读全文
posted @ 2021-01-28 03:27 purinliang 阅读(74) 评论(0) 推荐(0)
摘要:质因数分解法求Mobius函数 const int MAXN = 1e6 + 10; int p[MAXN], ptop; int pm[MAXN], pk[MAXN], mu[MAXN]; void sieve(int n) { memset(pm, 0, sizeof(pm[0]) * (n + 阅读全文
posted @ 2021-01-28 02:31 purinliang 阅读(218) 评论(0) 推荐(0)
摘要:$s_1(n)=\sum\limits_i=\frac{1}{2}n(n+1) \ s_2(n)=\sum\limits_i2=\frac{1}{6}n(n+1)(2n+1)\ s_3(n)=\sum\limits_i3=\frac{1}{4}n2(n+1)^2$ 注意 \(\sum\limits_ 阅读全文
posted @ 2021-01-28 00:25 purinliang 阅读(743) 评论(0) 推荐(0)
摘要:定义 下面讨论的图 \(G\) 均不存在孤立顶点(度数为0的顶点)。 欧拉回路和欧拉通路 通过图中所有边恰好一次的回路称为欧拉回路。 通过图中所有边恰好一次的通路称为欧拉通路。 欧拉图和半欧拉图 具有欧拉回路的无向图或有向图称为欧拉图。 具有欧拉通路但不具有欧拉回路的无向图或有向图称为半欧拉图。 若 阅读全文
posted @ 2021-01-27 15:43 purinliang 阅读(868) 评论(0) 推荐(0)
摘要:设 \(f[u]\) 为以1为根时,u节点的子树中的答案。 设 \(g[u]\) 为以1为根时,u节点向父亲p方向看,包括父亲p但不包括u节点的子树中的答案。 换根dp的时候一定要画一张图,简单说就是画一个众字形的图,v节点在最左下角,其父亲是u节点,父亲的父亲是“众”字最顶端的节点,那么最上面的人 阅读全文
posted @ 2021-01-27 10:26 purinliang 阅读(120) 评论(0) 推荐(0)
摘要:01背包 设 \(dp[i][j]\) 为处理完前 i 个物品,背包使用容量为 j 的最大价值。 for(int i = 1; i <= n; ++i) { for(int j = w[i]; j <= W; ++j) dp[i][j] = max(dp[i][j], dp[i - 1][j - w 阅读全文
posted @ 2021-01-27 10:09 purinliang 阅读(78) 评论(0) 推荐(0)
摘要:struct InverseMatrix { static const int MOD = 1e9 + 7; static const int MAXN = 400 + 10; int n; int A[MAXN][MAXN]; int B[MAXN][MAXN]; void Init(int n) 阅读全文
posted @ 2021-01-26 23:48 purinliang 阅读(241) 评论(0) 推荐(0)
摘要:struct Matrix { static const int MOD = 1e9 + 7; static const int MAXK = 400 + 10; int k, A[MAXK][MAXK]; void Init(int k) { this->k = k; memset(A, 0, s 阅读全文
posted @ 2021-01-26 22:33 purinliang 阅读(118) 评论(0) 推荐(0)
摘要:Burnside引理 设 \(A\) 和 \(B\) 为有限集合, \(X=B^A\) 表示所有从 \(B\) 到 \(A\) 的映射。 \(G\) 是 \(A\) 上的置换群, \(X/G\) 表示 \(G\) 作用在 \(X\) 上产生的所有等价类的集合(若 \(X\) 中的两个映射经过 \(G 阅读全文
posted @ 2021-01-26 12:49 purinliang 阅读(605) 评论(0) 推荐(0)
摘要:统计从S点到T点的路径上,哪些点是必经点,哪些边是必经边。 对有向图可以使用支配树,对于有向无环图也可以用计数哈希统计 \(f_S(i)\) 和 \(f_T(i)\) 表示从S到i和从i到T的路径数目。 阅读全文
posted @ 2021-01-25 00:52 purinliang 阅读(423) 评论(0) 推荐(0)
摘要:对于两个点,若从原图中删除其中除这两个点之外的任意一个点,都不能使得这两点不连通,则称这两点是点双连通。 点双连通不具有传递性,例如一个中国结一样的联排菱形。 DFS:无向图DFS,只有两种边,树边和非树边。由于DFS的性质,所以非树边一定是DFS树上的一对祖先-后代(未必不是父子,因为可能有多重边 阅读全文
posted @ 2021-01-25 00:46 purinliang 阅读(221) 评论(0) 推荐(0)