Trie 和 01 Trie

介绍 01-Trie 指将整数拆成二进制,然后将二进制以字符串的形式储存在 Trie 中。 Trie可以解决以下问题: 给定一些数 $a_1,a_2,…,a_

单调栈/队列

单调栈介绍 单调栈可以在 $O(n)$ 时间内解决 “对于每一个index,求右侧/左侧第一个对应数字比它大/小的index” 的问题。

基环树

定义 基环树指的是一个 $n$ 个节点,$n$ 条边的联通图。 叫基环树的原因是:给定一棵树,在这棵树上加上 任意一条边,就可以形成一个基环树了。 基环树的性

CCPC2020秦皇岛

排名 Solve: 5 (ADEFJ) Penalty: 767 Rank: 122/343 (35%) 题解 D - Exam Results 题意 给定 $n$ 个学生,第 $i$ 个学生的分数要么为 $a_i$,要么为 $b_i$。 给定整数 $P \in [1,100]$,如果最高

二次剩余

二次剩余用于解决在 模意义下开根 的问题: 题意 给定一个质数 $P$ 和一个非负整数 $N$,求 $x$ 使得 $$x^2 \equiv N (\text{mod } P)$$ 本问题等价于求 $$\sqrt N ~(\text{mod } P)$$ 性质 这个问题可能无

普通生成函数(OGF)

介绍 生成函数可以解决形如 满足XX条件的方案数共有多少种 的问题,它也能够解决 推导通项公式 等问题,生成函数常常与多项式运算结合在一起。 定义 对于一

多项式全家桶

模版 多项式全家桶(比较精简的版本,利用了Z) template<class T> T qpow(T a, int b) { T res = 1; while (b) { if (b & 1) res *= a; a *= a; b >>= 1; } return res; } int norm(int x) { if (x < 0) { x += mod; } if (x >=

NTT

模版 NTT const int mod = 998244353; const int maxn = (1<<22) + 5; struct NTT { const ll g = 3, invg = inv(g); // mod = 998244353 inline ll qpow(ll a, ll b) { ll res = 1; while (b) { if (b & 1) res = res * a % mod; a = a * a % mod; b >>= 1; } return res; } inline

FFT

.center { margin-left: auto; margin-right: auto; display: table; width: auto; } 模版 FFT const int maxn = (1<<22) + 5; // 注意这里需要是 > 2^k struct Complex { double x,y; Complex(double _x = 0.0, double _y = 0.0) { x = _x; y = _y; } Complex operator+(const Complex& b) const { return Complex(x + b.x, y + b.y); } Complex operator-(const Complex& b)

线性基

介绍 线性基是一般用于解决 子集XOR,XOR最值 一类问题的算法。 定义 线性基是一个 linear space,在这个space中,所有的向量为 非负整数,而 scalar 则