今天是 5 月 3 日,从今天开始天天打个卡,大概是晚上 8 点到 10 点之间更新,记录一天所学。算法
容斥应用在 min max 之间,有chrome
$$\max S = \sum_{T \subset S} (-1) ^ {|T| - 1} \min T$$数组
$$\min S = \sum_{T \subset S} (-1) ^ {|T| - 1} \max T$$数据结构
至于证实,我考虑第 $k$ 大做为最小时被算的次数,为闭包
$$\sum_{i = 1} ^ {k} \binom{k - 1}{i - 1} (-1) ^ {i - 1} = [k = 1]$$app
【BZOJ 4036】每次生成数 $[0, 2 ^ n)(n \le 20)$ ,生成 $i$ 的几率为 $p_i$ ,问指望多少次后或和为 $2 ^ n - 1$ 。less
取得全部,能够看出取得的时间的 max 。某个集合的 min 能够看作选到集合中某个的指望次数,能够转化为1除取得集合中某个的几率。ide
$$E(\max S) = \sum_{T \subset S} (-1) ^ {|T| - 1} \frac{1}{\sum_{i \cup T \ne \emptyset} p_i}$$函数
因此大概先处理好 $f_T = \sum_{i \cup T \ne \emptyset} p_i$ ,而后带上容斥系数直接求和。$f_T$ 能够考虑先用减法原理,考虑交集为空,而后对 $T$ 取补集,考虑子集和便可。优化
【经典问题】$n$ 种邮票,每次等几率随机,指望多少次能取得全部的 $n$ 种。这道题经过算两次,能够导出一个有趣的恒等式:
$$\sum_{i = 1} ^ n \frac{1}{i} = \sum_{i = 1} ^ n (-1) ^ {i - 1} \binom{n}{i} \frac{1}{i}$$
我尚未想到其余很好的组合证实,yay 给了差分相等,f(0) 相等的代数证实。大概有一些什么推广之类的。
【HDU】Endless Spinning:长度为 $n$ 的序列,每次将一个区间染成黑色,指望多少次所有黑?对于要求子集 $S$ 中的某一个位置变黑的指望操做次数,考虑子集变黑的几率,考虑子集不变黑的几率,为 $\sum \binom{b_i}{2}$ ,因此式子为
$$\sum_{S \subset [n]} (-1) ^ {|S| - 1} \frac{1}{1 - \frac{\sum \binom{b_i}{2}}{\binom{n}{2}}}$$
用一个 DP 来进行描述,我设计的状态为当前最后将第 i 个位置染黑,$\sum \binom{b_i}{2} = j$ 时的全部状况的 $(-1) ^ {|S| - 1}$ 的和。
我稍微思考了一下,以为 min max 容斥大概能够推广到形如 kthmax 这样的形式。
设
$$\text{kthmax}(S) = \sum_{T \subset S} f(|T|) \min(T)$$
考虑第 $x+1$ 大的元素被计算的次数,有
$$\sum_{i = 0} ^ x \binom{x}{i} f(i+1) = [x = k - 1]$$
二项式反演得
$$f(x+1) = (-1) ^ {x - k + 1} \binom{x}{k - 1}$$
$$f(x) = (-1) ^ {x - k} \binom{x - 1}{k - 1}$$
因此
$$\text{kthmax}(S) = \sum_{T \subset S} (-1) ^ {|T| - k} \binom{|T| - 1}{k - 1} \min (T)$$
根据这个原理,我能够设计下面这道题目。
【原创题】$n, m \le 1000, n - 10 \le K \le n$ ,有 $n$ 张邮票,拿到第 $i$ 张的几率为 $\frac{p_i}{m}$ ,问指望多少次,才能拿到 $K$ 张邮票,答案对 $998244353$ 取模。
套用 kthmax ,再利用指望的线性性质展开,以后就至关于问一个子集被选择的指望次数,变为几率分之一,式子很容易写出来,而后能够设计一个 $O(n m K)$ 的 DP ,为了转移,方程的其中一维与组合数的下指标有关。
区间 $[l, r]$ 的线性基能够 $O(bit)$ 快速处理。若 $l+2 \le r$ ,那么必定能够找到 $l \le x \le x+1 \le r$ ,且 $x$ 为偶数,因此最低位就职意了,只须要对高位进行递归。若 $l+1 = r$ ,那么直接把两个数字插进去。若 $l = r$ ,就把这一个数字插进去。
给定两个序列 $l[], r[]$ ,$l_i \le r_i$ ,如今问区间的区间的线性基。。。想来想去发现仍然只能套个线段树,作到三个 log 的复杂度,没想到怎么继续优化,但能够有一些常数优化。
给定一棵 $100000$ 个点的树,对全部路径上的不一样色数求和。
考虑每种颜色的贡献,算通过这种颜色的路径数量,转化为算不通过这种颜色的路径数量。考虑枚举每一个点,而后枚举它的后继,后继不断的进行搜索,不通过与最初枚举的点颜色相同的点,总共扫描到 $x$ 个点,贡献 $\binom{x}{2}$ ,再特殊考虑这种颜色的全部点的 LCA 外的点。能够把全部的颜色一次作,直接对这棵树进行一个 DFS ,sum[x] 表示 DFS 到当前位置时,去除掉颜色为 x 的全部 DFS 完的子树以后,总共去除掉了多少个点,只须要用这些数据来统计答案,并维护这些数据。我的以为这道题仍是蛮巧妙的。
发烧。
发烧。
半天用来发烧,半天用来学点东西。
2-SAT 的建图要充分必要,能够利用传递性。
2-SAT 判断是否有解,要根据两个点是否在同一个强连通份量。2-SAT 构造解,直接取两个强连通份量中较小的,能够根据 DFS 序的一些性质以及对称性进行证实。
「BZOJ 3495」Riddle :给定一张 100000 个点,200000 条边的图,点被划分为若干个点集,要求每一个点集中选择一个点,任意一条边至少有一个端点被选择,问是否有解。考虑 2-SAT ,每一个点包括了选或不选这两种可能。对于每一个点集中选择一个点这个限制,考虑将 i1 连向全部的 j2 ,构建 2n 个前缀、后缀辅助点,把边数优化到线性。
通常而言,就是这样一个模型:某个集合中选择有且仅有一个点,因而能够用上面的模型进行优化。有时候还能够用线段树,Trie 什么的来优化建图,总之都是些很显然的东西吧。
2-SAT 有一类在树上的套路,「Mythlogical - 改」:给定一棵 1000 个点的树,有 1000 个礼物,每一个礼物在某个点,且知足若干个礼物 x 和礼物 y 的路径通过点 c 的限制,或者礼物 x 和礼物 y 的 LCA 为点 c ,请构造一组方案。
设 Vi, j 表示礼物 i 是否在 j 子树中。先知足树上的限制,若在当前子树内,那么就在父亲的子树内,也不在兄弟的子树内,这样的条件是充分必要的,对于不在兄弟子树内的连边,考虑利用先前的技巧。而后礼物 x 和礼物 y 的路径通过点 c ,至关于礼物 x 和礼物 y 在点 c 的不一样子树,因此若 x 到点 c 的后继 v 子树内,点 y 就不在,若点 x 不在以 c 为根的子树内,点 y 就在。礼物 x 和礼物 y 的 LCA 为点 c ,则要求点 x 和点 y 都在以 c 为根的子树内,若 x 到点 c 的后继 v 子树内,点 y 就不在。
「GDOI 2018 Day 3 Prob 1」给定三维,若 i 有两维大于 j ,那么能够利用 i 消除 j ,问有多少个点可能被保留到最后。
若 i 能够消除 j ,那么 i, j 连边,问题变为有哪些点能够做为某个树形子图的根节点。两两可比,会连成一个竞赛图,竞赛图缩点后是一条链,有且仅有第一个强连通份量内的点能够做为树形子图的根。枚举两维,用可持久化线段树来优化一下连边,跑跑 Tarjan ,取最后一个有 1 到 n 间的点的强连通份量。
总之二维偏序的建图能够用可持久化线段树进行辅助,每次连向前缀对应的若干个线段树节点,而后把当前节点的信息也加到可持久化线段树里面去。推广到三维偏序,考虑对其中的一维进行 CDQ 分治,剩下的两维照作就是了。
竞赛图相关的另一个问题就是竞赛图存在哈密顿路径,强联通的竞赛图存在哈密顿回路,我能够结合出这样一个问题:三维,若 i 有两维大于 j ,则能够利用 i 消除 j ,请构造一个最长的消除序列。我知道最长的消除序列的长度必定是 n ,构造也能够暴力构造,时间复杂度为 O(n ^ 2) ,我还想不到能不能利用偏序的一些性质把复杂度优化。
给定 100000 个 10 ^ 10 之内的数,选择尽量多的数,使得两两乘积不为 cube 。
分析乘积不为 cube ,容易想到素数分解,每一个素数的指数能够先化简到 0 到 2 之间。当 p 必定的时候,pq 为 cube 的 q 惟一肯定,换句话说,为 cube 的数一一对应,因此作法大体就是对于每对数,取出现次数的 max 相加便可。化简时,考虑被化简的素数知足 p ^ 3 < 10 ^ 10 ,因此只用枚举 p < 10 ^ {10 / 3} 。求补数时,对于 p ^ 3 < 10 ^ 10 ,进行暴力取补,分解剩下的只多是 p ^ 2 ,p, 或 pq ,判断是否是彻底平方数就能够处理补数了。
另外,这道题的补数的数值可能会爆 long long ,正确的作法是不用处理它,由于咱们不在乎值是多少,只在乎值相不相同。
很容易能够把问题推广到两两乘积不为四次方数,化简的时候枚举到 10 ^ {10 / 4} ,求补数的时候要枚举到 10 ^ {10 / 3} ,因此说原题中两个都枚举到 10 ^ {10 / 3} 相同只是巧合。。
「PE 201」:给定 1000 个三角形,判断原点在不在三角形内部。判断的方法是看是否都在同一侧,即 Ai × Ai+1 >= 0 是否都成立,或 Ai × Ai+1 <= 0 是否都成立。
原创题:给定若干种比重为 xi + yi + zi = 100% 的原料,每种原料若干,问是否能合成比重为 X + Y + Z 的生产品。保留两维,能合成的部分在凸包的内部,把上凸壳的全部点和下凸壳的全部点找出来,对于每次询问,分别在上凸壳和下凸壳上二分,求出凸壳上 x = X 对应的 Y ,而后判断是否在区间内。
通常地,若是要判断一个点是否在凹多边形内,那么就从这个点引出一条射线,若与多边形有偶数个交点,就在内部,若与多边形有奇数个交点,就在外部。
有 10 个位置,最初每一个位置上的数值都是 $n = \sum_{i = 1} ^ {10000} p_i ^ {e_i}$ ,知足 $\sigma e \le 300000$ ,每次依此对每一个位置操做,把这个位置的数变为某个真因数,某个位置变为 1 的时候结束,问以每一个位置结束的方案数对 $998244353$ 取模。
分析以下:
不难想到一个辅助问题:设 $f(i)$ 表示 $n$ 刚好在 $i$ 回合变成 $1$ 的方案数。
先考虑原问题与辅助问题的关系,当前考虑第 x 个位置做为终止位置的方案数,枚举在 i 个回合的时候结束,那么前 x+1 个位置能够看做在第 i+1 个回合结束,后面的位置能够看做在第 i 个回合结束,因此第 x 个位置的答案就是 $\sum_i f ^ {x - 1}(i+1) f ^ {n - x + 1} (i)$ 。
如今考虑如何求解 $f(x)$ ,注意到每一个因子之间都是独立的,$k$ 次机会要把每一个指数都变为 $0$ ,能够看做一个插板,再来个广义的容斥,就能够获得
$$f(x) = \sum_{k = 1} ^ x (-1) ^ {x - k} \binom{x}{k} \prod_{i = 1} ^ m \binom{e_i + k - 1}{k - 1}$$
$f(x)$ 能够直接卷积求出。
注意到 $e_i$ 的和为 $300000$ ,因此取值个数为 $O(\sqrt n)$ ,因此直接暴力求 $\prod_{i = 1} ^ m \binom{e_i + k - 1}{k - 1}$ 。
小结:
(1)前 x+1 个位置并无结束,可是我能够巧妙地把问题看做「取完第一个以后,剩下的所有要取完」,因此每一个位置就都独立了。
(2)「一个数,每次变为它的一个因子,变成 1 的时候结束」,能够分开每一个素因子来看,每次把指数减少,若是 x 次结束,至关于隔 x-1 块版。
(4)$\sum e$ 的和为 $300000$ ,这隐含的条件是 $e_i$ 的种类数为 $\sqrt 300000$ ,而后就是一个大暴力了。
相似的,记得之前有某道题 $fgh \le 10000$ ,那么存在 $f \le 21$ ,而后暴力枚举 $f$ ,对剩下的两维就有快速作法了。
五边形数从小到大进行排序,能够描述为 ..., 1 / 2 i (3i - 1) , 1 / 2 i (3i + 1) , ... ,实现的时候能够方便地预处理这个顺序。
$$\Phi(x) = \prod_{i \ge 1} (1 - x ^ i) = \sum_{i \in \mathbb{N}} (-1) ^ i x ^ {\frac{1}{2} i (3i + 1)} = 1 + \sum_{i \ge 1} (-1) ^ i x ^ {\frac{1}{2} i (3i \pm 1)}$$
五边形数在前 $n$ 项只有 $O(\sqrt n)$ 项,因此能够暴力求逆,暴力卷积,暴力 XXX ,总之对于多项式的操做,能够作到项数相关,若是项数很少,那么就能够暴力啊。
分拆数:
$$\prod_{i = 1} ^ n (1 + x ^ i + x ^ {2i} + ...) = \prod_{i = 1} ^ n \frac{1}{1 - x} = \frac{1}{\Phi(x)}$$
原创:给定 $n$ ,求 $n$ 元排列中,逆序对个数为 $0, 1, ..., n-1$ 的排列的个数。$i$ 的逆序个数为 $[0, i)$ ,因此直接列生成函数
$$\prod_{i = 0} ^ n (1 + ... + x ^ {i-1}) = \prod_{i = 1} ^ n \frac{1 - x ^ i}{1 - x} \equiv (\sum_i \binom{n + i - 1}{i - 1} x ^ i) \Phi(x) \pmod {x ^ n}$$
分拆数,每一个数的出现次数小于 $k$ :
$$\prod_{i = 1} ^ n (1 + x ^ i + ... + x ^ {i(k - 1)}) = \prod_i \frac{1 - (x ^ k) ^ i}{1 - x ^ i} = \frac{\Phi(x ^ k)}{\Phi(x)}$$
分拆数,全部数不重复:这是上一道题的特殊化形式,能够直接用上一道题的方法作。
「2017 Multi-University Training Contest 1」:给定 $n = 100000$ 元排列 $A$ ,以及 $m = 100000$ 元排列 $B$ ,问有多少个 $[0, n)$ 到 $[0, m)$ 的映射,知足 $f(i) = B_{f(A_i)}$ 。
这道题的 Main Idea 就是把一个 $n$ 元排列看做一个置换,剩下的都水稻渠成。
小结(1) :序列 $a_1, a_2, ..., a_n$ 一般均可以怎么看?能够看做一个数列,每一个位置有一个数。能够看做二维平面上的 n 个点。能够看做第 i 个位置有高度为 i 的一堆积木。若是是排列,那么可能会用到每一个数字只出现一次的性质进行计数,例如排列的三维偏序。颇有可能会把排列看做一个置换,特别涉及到比较复杂的映射的问题。
经典题:对于 n 元置换 f ,给定 f ^ 2 ,请构造一个 f 。原来的置换无疑是一个重要的辅助元素,考虑对原先的置换的循环节分大小为奇数、偶数继续讨论,将新的置换拆成若干个循环节,对大小为偶数且相同的两个循环拼起来,大小为奇数的直接本身造本身。
今天基本上都用来思考这样一个推广:对于 n 元置换 f ,给定 f ^ n ,请构造一个 f ,并问有多少个 f ,对 998244353 取模。对原先一个大小为 $a$ 的置换,会分解为 $(a, n)$ 个大小为 $\frac{a}{(a, n)}$ 的置换。对新的置换来讲,先把它进行分解,设 c(b) 表示大小为 b 的置换的个数。考虑枚举全部的 b ,并尝试进行合并。考虑能够将多少个大小为 b 的东西进行合并,设个数为 d ,则要知足 $(b, \frac{n}{d}) = 1$ ,因此 $d = (n, b) k$ ,若是 $(n, b) \nmid c(b)$ ,那么说什么都不能够,不然就能够构造了。至于方案数,设 $f(x)$ 表示将 $x$ 个大小为 $b$ 的置换进行若干次合并的方案数,则有 $f(x) = \sum_{i = 1} ^ x \binom{x - 1}{i - 1} f(x - i) g(i)$ ,$g(d)$ 表示将 $d$ 个大小为 $x$ 的东西合并在一块儿的方案数,若 $(n, b) \nmid d$ ,那么 $g(d) = 0$ ,不然钦定第一个位置,对第一个循环节内的元素进行钦定——钦定每一个置换的放置顺序,以及放置那一个元素,因此 $g(d) = (d - 1) ! s ^ {d - 1}$ 。这时候能够进行分治 FFT ,或者 EGF ,$F = e ^ G$ 。
给定 10 个长度为 100000 的序列,每一个序列中选择一项,求和的前 100000 小。
能够考虑每次合并两个序列,取前 100000 小。第一种作法,把两个序列从小到大排序,那么每次的决策对象只有 O(n) 个,能够在一维平面上拓展,也能够在二维平面上拓展。第二种作法,注意到要知足 ij <= n ,因此只有 O(n log n) 个,把这些东西取出来,而后排序。
能够考虑直接作 K 维,直接在 K 维超几何体上 BFS ,用堆维护较优决策点,每次选择一个最优的对象拓展,而后枚举周围的点,若它的每一维都被紧密相接了,那么加入较优决策点的集合中,实现起来会有些麻烦。
「2017 Multi-University Training Contest 1」:给定一个仙人掌,求前 K 小的生成树。把仙人掌的每一个环上的点权弄出来,而后就是上面的问题了。
对于每一个位置 i ,给定 L[i] <= i <= R[i] ,问有多少个 1 到 n 的排列,知足对于任意的 i ,当且仅当 L[i] <= l <= i <= r <= R[i] ,a[i] = min(a[l], ..., a[r]) 。
也就是说 i 在 L[i] 到 R[i] 之间最小,且对于更大的区间都不知足。
对总体而言,必定有一个最小值的位置 x ,这个最小值的 L = 1, R = n 。对于其余的 L, R ,必定不会过点 x ,因此会被划分到 x 的两侧,因此只须要对两侧进行递归处理。假如先递归左边,再递归右边,那么每次找到的区间的顺序就是按照左端点递增、右端点递减进行排序的顺序。
先考虑断定有没有解。那么就对区间进行双关键字排序,而后直接模拟,进行断定下个区间是否知足要求 L = 当前分治的 l ,R = 当前分治的 R 。
考虑统计方案数,每次左子树大小为 x ,右子树大小为 y ,那么贡献 $\binom{x + y}{x}$ 。
三、今天基本上都在看几率生成函数,还没干完。
今天学了挺多东西的。
设某个图上的性质 X ,若每一个连通块知足性质 X ,那么整个图知足性质 X 。
设 f(x) 为 x 个点的知足性质的连通图个数,g(x) 为 x 个点的知足性质的图的个数。
一方面,有
$$g(x) = \sum_{i = 1} ^ x \binom{x - 1}{i - 1} f(i) g(x - i)$$
$$f(x) = g(x) - \sum_{i = 1} ^ {x - 1} \binom{x - 1}{i - 1} f(i) g(x - i)$$
另外一方面,设 f(x), g(x) 的 EGF 为 F(x), G(x) ,有
$$F(x) = e ^ {G(x)}$$
$$G(x) = \ln F(x)$$
用处一:给定第一方面,可使用分治 FFT 的作法,也能够转化为第二方面,求 exp 或者求 ln 。
用处二:求 exp 的问题,能够经过这个组合意义,在 O(n ^ 2) 实现。
第二类斯特林数:
(1)第二类斯特林数行
根据容斥原理,
$${n \brace m} = \sum_{i = 0} ^ {m} (-1) ^ i \binom{m}{i} (m - i) ^ n$$
(2)第二类斯特林列,OGF
$${n \brace m} = {n - 1 \brace m - 1} + m {n - 1 \brace m}$$
设 $F_m(x)$ 为 $x \brace m$ 的 OGF ,那么有
$$F_m(x) = F_{m - 1}(x) x + F_m(x) m x$$
$$F_m(x) = \frac{x}{1 - m x} F_{m - 1}(X)$$
$$F_m(x) = x ^ m \prod_{i = 1} ^ m \frac{1}{1 - ix}$$
能够利用 ln-exp 的科技求解 $F_m(x)$ 。
(3)第二类斯特林列,EGF,以及第二类斯特林行的另一种见解
考虑 EGF ,$n$ 个点的知足性质的连通图只有一个,因此 EGF 为 $e ^ x$ ,因此 $n$ 个点且刚好 $m$ 个连通块的图的个数的 EGF 为
$$F_m(x) = \frac{(e ^ x - 1) ^ m}{m !}$$
能够用来处理一列的第二类斯特林数。
这种形式也能够推出一行的第二类斯特林数,原理是直接对上面的生成函数进行二项式展开,并取第 $n$ 项:
$${n \brace m} = [x ^ n] \frac{(e ^ x - 1) ^ m}{m !} = [x ^ n] \frac{\sum_{i} \binom{m}{i} e ^ {ix} (-1) ^ {m - i}}{m !} = \frac{1}{m !} \sum_i \binom{m}{i} i ^ n (-1) ^ {m - i}$$
第一类斯特林数:
(1)第一类斯特林行
根据组合意义,能够推出
$$x ^ {\overline{n}} = \sum_{i} {n \brack i} x ^ i$$
上面这个式子还有另一种推法,就是根据
$${n \brack m} = (n - 1) {n - 1 \brack m} + {n - 1 \brack m - 1}$$
利用 OGF ,有
$$F_n(x) = (n - 1) F_{n - 1} (x) + F_{n - 1}(x) x = (x + n - 1) F_{n - 1} (x) = ... = x ^ {\overline{n}}$$
第一种作法是分治 FFT ,第二种作法是倍增 + FFT ,能够用来处理一行的第二类斯特林数。
(2)第一类斯特林列
利用 EGF ,$n$ 个点的知足性质的连通图个数为 $(n - 1) !$ ,EGF 为
$$F(x) = \sum_i \frac{(i - 1) ! x ^ i}{i !} = \sum_i \frac{x ^ i}{i} = - \ln (1 - x)$$
因此第一类斯特林列的 EGF 为
$$G(x) = \frac{{- \ln (1 - x) - 1} ^ m}{m !}$$
Bell 数:
相似第二类斯特林列的 EGF 作法,Bell 数的 EGF 显然为
$$G(x) = e ^ {e ^ x - 1}$$
$$f(x) = \sum_i {x \brace i} g(i) \Leftrightarrow g(x) = \sum_i (-1) ^ {x - i} {x \brack i} f(i)$$
$$f(x) = \sum_i {x \brack i} g(i) \Leftrightarrow g(x) = \sum_i (-1) ^ {x - i} {x \brace i} f(i)$$
证实的话,大概就是用几条式子进行展开,获得两条第一类与第二类的卷积式,而后就能够轻易证实这四个关系。
斯特林反演能够用来解决连通图的相关问题,不只能够处理连通图的问题,还能够处理 10 个连通图的问题,还能够定义连通块的大小为集合 $S$ 中的数是合法的,经过 Stirling 反演,也能够求出迷之容斥系数。
对于连通的问题,大体能回忆其连通图与通常图计数,还有就是斯特林反演。
「例题」10 个点的一张简单图,问有多少个边的子集,知足保留子集中的边后,该图连通。
考虑钦定若干个块,块之间没有连边,块內随便连,而后贡献上容斥系数后累加,如今求解容斥系数。
设我有某个其实是 $x$ 个连通块的方案,它应该被计算 $[x = 1]$ 次,实际上在全部更仔细的分块中被统计,因此
$$[x = 1] = \sum_i {i \brace x} f(i)$$
$$f(x) = (-1) ^ {x - 1} {x \brack 1} = (-1) ^ {x - 1} (x - 1) !$$
再说 「BZOJ」上「异或图」一题,也是用到相同的思想。
「问题一」n 个点带标号每一个连通块有欧拉回路的图的个数。
考虑构建生成树,生成树外的边的一种选择方案,树边能够经过树形 DP 惟一肯定选择方案,因此答案为
$$cnt = 2 ^ {\binom{n}{2} - n + 1}$$
「问题二」n 个点带标号连通欧拉图个数。
「问题三」给定一张图,每一个点有奇偶性 $d_i$ ,问有多少种边的保留方式,使得每一个点的度数知足奇偶性要求。
若是一个连通块内的 $\sum d$ 为奇数,直接无解,不然设 $C$ 为连通块个数,答案为
$$cnt = 2 ^ {m - n + C}$$
「问题四」给定一张图,求有多少个知足每一个连通块有欧拉回路的边的子图。
「问题五」给定一张图,求知足每一个连通块有欧拉回路的边的子图的边数的平方和。
「问题六」60 个点无标号图个数。
套用 Burnside ,枚举全部的置换,分解成若干个循环节,循环节内部可怜 $\left\{ \frac{s}{2} \right\}$ 条边,两个循环节可怜 $(s_1, s_2)$ 条边,因此总共的方案数为
$$2 ^ {\sum \left\{ \frac{s_i}{2} \right\}} + \sum (s_i, s_j)$$
发现答案只与分拆方案有关,因此考虑枚举全部分拆,并统计一种分拆能够对应多少个置换,个数能够看做对 $n !$ 种排列都进行生成,而后再去重,应该是
$$\frac{n !}{ \prod_{\text{每种 si ,出现 ci 次}} s_i ^ {c_i} c_i ! }$$
「问题七」「原创」60 个点每一个连通块有欧拉回路的图的个数。
枚举每种分拆。
对于一个大小为 s 的循环,考虑内部的连边,若 s 为奇数,那么全部连边都不会产生影响;若 s 为偶数,那么 distance 为 s / 2 的连边会使每一个点的度数的奇偶性异或一,其余能够随便连。
考虑两个连通块之间的连边,设循环大小为 s1, s2 ,则有 (s1, s2) 次机会,左边的每一个点向右边连 s2 / (s1, s2) 条边,右边的每一个点向左边连 s1 / (s1, s2) 条边。若 s2 / (s1, s2) ,s1 / (s1, s2) 都是偶数,那么随便连。若存在一个奇数,那么有 (s1, s2) 个机会对 A 中全部点异或一。若两个都是奇数,则有 (s1, s2) 次机会,对 A、B 中全部点异或一,咱们在两个点之间连边,边权为 (s1, s2) 。
到这里,能够看出一个循环内全部点的度数奇偶性一致,因此能够把每一个循环看做一个大点,来进行分析,设 d(x) 为大点 x 可以异或一的机会次数,即
$$d(x) = \sum_{\text{odd, even} (s_x, s_?)} + [\text{s(x) is even}]$$
问题变为:每一个点能够选择 d(x) 次异或一的机会,连边的两个点之间能够选择边权次异或一的机会,问有多少种选择方案,使得每一个点最终为 0 。
分每一个连通块进行讨论,这个连通块的单点异或次数必定要是偶数,并且是偶数时,边的选择方案都为 $2 ^ {\sum_{odd, odd} (s_i, s_j)} - \text{点数} + 1$ 。与点的选择方案独立,因此直接相乘。设 $C = \sum d$ ,那么点的异或方案为
$$\sum_{2 | i} \binom{C}{i} = [C = 0] + [C \ne 0] 2 ^ {C - 1}$$
组合解释是对于前面 $C - 1$ 个的选择方案,最后一个都有惟一的选择方案与之对应。代数证实能够经过数学概括法,或者用单位复数根和二项式定理。
综上所述,答案为
$$\text{answer} = \frac{1}{n !} \sum_{\text{分拆} P \in \text{Split}(n)} \frac{n !}{ \prod_{\text{每种 si ,出现 ci 次}} s_i ^ {c_i} c_i ! } 2 ^ {\sum \lfloor \frac{s_i}{2} \rfloor + \sum_{\text{even, even}} (s_i, s_j)} \prod_{\text{连通块}} 2 ^ {\sum_{odd, odd} (s_i, s_j) - \text{点数} + 1} \times ([\sum d = 0] + [\sum d \ne 0] 2 ^ {\sum d - 1})$$
「问题八」10 个点连通欧拉图计数
只须要再套用一个斯特林反演,就能够解决这个问题啦,时间复杂度为 n * sum ( Bell(i) * 把 n 分拆成 i 个数的方案 )。
这个问题还不太会作,由于不能保证一个循环节内部的连通性。
$$C(x) = \sum_{i - j = x} A(i) B(j)$$
作的时候至关于把 B 反过来作,附上了 $n - 1$ 的位移。
好比说,容斥原理带来的一些 FFT 的问题,最令我恼火的是
$$g(x) = \sum_{i = x} ^ n (-1) ^ {i - x} \binom{i}{x} f(x)$$
(1)设离散随机变量 X 的几率生成函数为
$$F(x) = \sum_{i} P(X = i) x ^ i$$
它能够比较方便简介的求出随机变量 X 的指望和方差:
$$E(x) = \sum_i i P(x = i) = F'(1)$$
$$E(x ^ \underline{k}) = \sum_i i ^ {\underline{k}} P(x = i) = F ^ (k)(1)$$
$$Var(x) = E(X ^ 2) - E(X) ^ 2 = F''(1) + F'(1) - F'(1) ^ 2$$
(2)Matrix67 的书里的一道题目的我想到的五种解法
抛硬币,问首次出现连续两次朝上的指望次数。
「作法一」指望的定义
$$answer = \sum_i i \frac{1}{4} f(i - 2)$$
$f(x)$ 表示抛到第 $x$ 次,第 $x$ 次朝下,以前没有发生过两次朝上的几率,那么
$$f(x) = \frac{1}{4} f(x - 2) + \frac{1}{2} f(x - 1)$$
构建 OGF ,有
$$F(x) = \frac{4}{1 - 2x - x ^ 2}$$
$$answer = \frac{1}{4} (F'(1) + 2F(1)) = 6$$
「作法二」指望的阿贝尔求和形式的定义
$$answer = \sum_{i \ge 0} P(X > i) = \sum_i \frac{1}{2} f(i - 1) + f(i) = \frac{3}{2} F'(1) = 6$$
「作法三」几率生成函数
设 $f(i)$ 表示 $i$ 次刚好结束的几率,$g(i)$ 表示 $i$ 次没有结束的几率,对应的 OGF 为 $F(x), G(x)$ ,那么
$$F(x) + G(x) = 1 + x G(x)$$
$$G(x) \frac{x ^ 2}{4} = (\frac{x}{2} + 1) F(x)$$
对第一条式子求导并代入 $x = 1$ ,有
$$F'(1) = G(1)$$
对第二条式子带入 $x = 1$ ,很容易解得
$G(1) = 6$
「作法四」直接设指望的状态
设 f(i) 表示当前凑到了 i 个向上,到凑到两个向上的指望次数。
f(0) = 1 + 1 / 2 f(0) + 1 / 2 f(1)
f(1) = 1 + 1 / 2 f(0) + 1 / 2 f(2)
f(2) = 0
解一下方程,答案就出来了。
「作法五」指望的线性性质
设 f(i) 表示当前凑到了 i 个向上,到凑到 i+1 个向上的指望次数。
f(0) = 1 / (1 / 2) = 2
f(1) = 1 + 1 / 2 (f(0) + f(1)), f(1) = 4
因此答案为 f(0) + f(1) = 6 。
(3)一个北京集训时的题目
给定一个字符集为 m ,长度为 L 的字符串 S ,每次在末尾随机生成一个字符,问指望多少次出现 S 。
设 f(i) 表示 i 回合结束的几率,g(i) 表示 i 回合没结束的几率,相似的列一列式子,第二个式子就考虑对 「在一个未出现 S 的状态后添加一个 S 后,这个获得的状态的几率」进行算两次,一方面能够看做 $g_{cur - L} \frac{1}{m ^ L}$ ,一方面能够看做 $\sum_i a_i f(cur - (L - i)) \frac{1}{m ^ {L - i}}$
$$F(x) + G(x) = 1 + x G(x)$$
$$G(x) \frac{x ^ L}{m ^ L} = \sum_i a_i \frac{x ^ {L - i}}{m ^ {L - i}}$$
对第一个式子求导并代入 $x = 1$ ,而后对第二个式子代入 $x = 1$ ,就能求出当时我百思不得其解的简单结论:
$$E(x) = \sum_i a_i m ^ i$$
(4)多个串的问题
SDOI 硬币游戏
(5)一个有趣的几率问题:每次随机 $1$ 到某个偶数 $n$ ,若 $x$ 为奇数,那么计数器清零,若 $x$ 为偶数,那么计数器加一,且若 $x = n$ ,则中止,求结束时计数器的指望值。
从这个例子能够看出,能够经过几率或者指望来列关系式。
元素两两不一样、长度为 $n ^ 2 + 1$ 的序列要么存在长度为 $n+1$ 的上升子序列,要么存在长度为 $n+1$ 的降低子序列。
证实一:
问题能够转化为,该序列的长度为 $n$ 的降低子序列的长度最多为 $n$ ,求证该序列存在长度为 $n+1$ 的上升子序列。
看到子序列,容易想到 DP 的方法,因此咱们引入这样一个辅助元素:设 $f(i)$ 表示以 $i$ 为开头的最长降低子序列的长度。
而后我思考的方向是去发现 $f$ 与上升子序列的关系,开始并无什么发现,因此就直接尝试观察 $f$ 的性质。对于某个位置 $x$ 做为开头,我应该怎样取它的全部最长降低子序列?那么确定要取 $y > x, f[y] = f[x] - 1$ 。考虑若干个 $y$ 之间的关系,发现对于 $y_1 < y_2, f_{y_1} = f_{y_2}$ ,确定有 $a_{y_1} < a_{y_2}$ ,不然 $f_{y_1}$ 就能够由 $f_{y_2}$ 进行更新。因此对 $x$ 的研究也不须要了。
对于 $f$ 值相同的 $y_1 < y_2 < ... < y_m$ ,确定有 $a_{y_1} < a_{y_2} < ... < a_{y_m}$ 。而注意到 $f$ 的取值只有 $1, ..., n$ ,因此根据鸽巢定理,必定存在一个 $f$ 的取值,知足 $m \ge n+1$ ,因此存在长度为 $n+1$ 的上升子序列。
证实二:
直接利用 dilworth 定理,最长降低子序列能够看做最长反链,数值上等于最小链划分,而最长上升子序列的长度最多为 $n$ ,因此链划分至少为 $n+1$ 。
题意:已知 $n = 10 ^ 5$ 个 $10 ^ 6$ 之内的正整数 $a_1, a_2, ..., a_n$ ,求 $\text{LCM}(\text{fib}(a_1), \text{fib}(a_2), ..., \text{fib}(a_n))$ 对 $1000000007$ 取模。
分析:
(1)fib 序列的更多性质
fib 序列首先会想到通项公式,而后对 LCM 并无什么帮助,因此要探究 fib 的更多性质,和 gcd 一块儿考虑一下,或许就能发现
$$(f_n, f_m) = f_{(n, m)}$$
证实:
想看一个很特殊的状况,
$$(f_0, f_1) = 1$$
$$(f_n, f_{n - 1}) = (f_n - f_{n - 1}, f_{n - 1}) = (f_{n - 2}, f_{n - 1}) = 1$$
注意到
$$f_{(n, m)} = (f_{(n, m)}, f_0)$$
因此考虑模拟欧几里得算法的过程,只需尝试证实
$$(f_n, f_m) = (f_{n - m}, f_m)$$
因此须要将 $f_n$ 用 $f_m$ 进行表示,展开试试
$$
\begin{aligned}
f_n & = f_{n - 1} + f_{n - 2} \\
& = 2 f_{n - 2} + f_{n - 3} \\
& = 3 f_{n - 3} + 2 f_{n - 4} \\
& = 5 f_{n - 4} + 3 f_{n - 3} \\
& = f_5 f_{n - 4} + f_4 f_{n - 3}
\end{aligned}
$$
$$f_n = f_{m + 1} f_{n - m} + f_m f_{n - m + 1}$$
$$(f_n, f_m) = (f_{m + 1} f_{n - m} + f_m f_{n - m + 1}, f_m) = (f_{n - m}, f_m)$$
(2)min - max 容斥应用在多个数的 lcm上
尝试将 gcd 与 lcm 进行联系,
$$\gcd = \prod_i p_i ^ {\min a_i}$$
$$\text{lcm} = \prod_i p_i ^ {\max a_i}$$
因此考虑对目标量的指数进行 min-max 容斥,因此
$$\text{LCM}(f(1 .. n)) = \prod_{S \subset [n]} { \left\{ \gcd(f(S)) \right\} } ^ {(-1) ^ {|S| - 1}} = \prod_{S \subset [n]} { \left\{ f(\gcd S) \right\} } ^ {(-1) ^ {|S| - 1}}$$
(3)莫比乌斯反演
设 $c(x)$ 表示 $\gcd S = x$ 的全部 $S$ 的 ${(-1) ^ {|S| - 1}}$ 的和,那么须要辅助量 $d(x)$ 表示 $x | \gcd S$ 的全部 $S$ 的 ${(-1) ^ {|S| - 1}}$ 的和。
设存在 $n$ 个 $x$ 的倍数,那么
$$d(x) = \sum_{i = 1} ^ n \binom{n}{i} (-1) ^ {i - 1} = [n \ne 0]$$
在 $O(n \log n)$ 处理出 $d$ ,近而能够在 $O(n \log n)$ 处理出 $c$ ,答案就是
$$\text{LCM}(f(1 .. n)) = \prod_{i = 1} ^ {1000000} {f(i)} ^ {c(i)}$$
注意 $c(i)$ 可能为负数,因此 pow(x, t) 时要将 $t$ 先对 $P - 1$ 取模。
(4)小结
首先是 fib 的两个性质,一个是展开的性质,一个是 (fa, fb) = f(a, b) 。
而后多个数的 LCM 能够考虑对指数进行 min-max 容斥,转化为 gcd 的乘积,我一样能够定义每一个指数取第 K 大的函数,而后使用 min-max 容斥转化为 gcd 的乘积,不过这就有点太人为构造了。
(1)平时的训练,应该怀着不断学会本身不会的东西的态度。真正的迅速,是进行了充分的计划,而后无限的投入到题目中去,而不是去想作什么、作什么,作到一半又作不下去,而后又换一个东西去作,最后只有干着急而啥都干不成。
(2)解题要有可以解题的思惟,要有充分的积累。平时训练的时候就要让本身充分思考,独立思考,实在不会的时候再看一点提示,不要看全部,要充分利用这道题的价值。总结的时候要发现本身思考过程当中一些不和谐的地方,以及积累一些常见的模型。
(1)结论:
$$\begin{cases} f(p ^ k) = 1 - (p - 1) k \\ f(ab) = f(a) f(b) , (a, b) = 1 \end{cases}$$
(2)第一种思路:打表找规律,先找质数的,再找 $p ^ k$ 的,数论函数可能会具备积性,发现确实具备积性。
(3)第二种思路:
$$g \times \phi = I$$
因为
$$\phi \times I = Id$$
$$\phi = \mu \times Id$$
$$g \times Id \times \mu = I$$
$$g = I \times I \times {Id} ^ {-1} = \sigma_0 \times (\mu * Id)$$
$$g(n) = \sum_{ab = d} \mu(a) a \sigma_0(b)$$
因为 $g$ 是两个积性函数的狄利克雷卷积,因此 $g$ 也是积性函数,再考虑 $g(p ^ k)$ ,显然:
$$g(p ^ k) = \sum_{i = 0} ^ k \mu(p ^ i) p ^ i \sigma_0(p ^ {k - i}) = (p + 1) - pk = 1 - (p - 1) k$$
(4)phi 在狄利克雷卷积意义下的逆元
(5)积性函数与狄利克雷卷积相关的性质的推广
定理一:若 $f$ 是积性函数,则 $f ^ {-1}$ 是积性函数。
证实:设积性函数的全集为 $S$ ,证实 $(S, \times)$ 是一个阿贝尔群便可。封闭性由「两个积性函数的狄利克雷卷积」这个性质能够得证,结合律由狄利克雷卷积的定义得证,存在单位元 $e = \left\{ 1, 0, 0, 0, ... \right\}$ ,要证实存在逆元,等价于证实存在消去律。
$$\sum_{d | n} a(d) c(\frac{n}{d}) = \sum_{d | n} b(d) c(\frac{n}{d})$$
对 $n$ 用概括法,因而
$$a(n) c(1) = b(n) c(1)$$
由于 $c$ 是积性函数,因此 $c(1) = 1 \ne 0$ ,因此
$$a(n) = b(n)$$
辅助定理一:$(S, \times)$ 知足封闭性、结合律,有单位元,则 $(S, \times)$ 有逆元当且仅当知足消去律。
证实:如有逆元,显然知足消去律。如有消去律,尝试对任意的 $a \in S$ 证实有逆元,构造
$$S' = \left\{ a \times x, x \in S \right\}$$
根据封闭性,有 $S' \subset S$ ,因为知足消去律,因此 $|S'| = S$ ,因此 $S = S'$ ,而 $S$ 中有单位元 $e$ ,因此 $S'$ 中也有单位元 $e$ ,因此存在 $x$ ,使得 $a \times x = e$ 。
定理二:设 $f$ 是积性函数,$g, h$ 是数论函数,$f \times g = h$ ,则 $g$ 是积性函数当且仅当 $h$ 是积性函数。
证实:充分性显然,考虑必要性。
$$f \times g = h$$
$$f = g ^ {-1} \times h$$
(1)题意:中点按照六边形的方式向外拓展 ${10} ^ 8$ 层,问从中点不能看到的点的个数。
(2)分析:
首先发现能够划分为若干个三角形,每一个三角形互不遮挡,对每一个三角形计算,答案乘六。而后找找规律,发现没有规律。可见点个数不难想到某道欧拉函数题,可是这道题的点的坐标很差处理,这看似也行不通,也想不到什么好的辅助问题。
就当我准备放弃的时候,我忽然想到可否对点构造某种变换,使得在一条直线上的点还在一条直线上,不在一条直线上的点也还不在一条直线上,这好像叫线性变换?。。。。而后就把猜测把斜着的三角形给放直,坐标就好表示了,以后就是一个经典的数论问题,验证发现没有问题,那么就这样作了。
(3)构建一个变换
对某个重要的概念进行一个等价的变换,使得其余的条件变得更加的简洁可作。
就当我准备放弃的时候,我忽然想到可否对点构造某种变换,使得在一条直线上的点还在一条直线上,不在一条直线上的点也还不在一条直线上,这好像叫线性变换?。。。。而后就把猜测把斜着的三角形给放直,坐标就好表示了,以后就是一个经典的数论问题,验证发现没有问题,那么就这样作了。
平面上有 $100000$ 个点 $(x_i, y_i)$ ,两个点 $i, j$ 的距离被定义为 $|x_i - x_j| + |y_i - y_j|$ ,求最远点对。考虑将点 $(x, y)$ 变换为点 $(x + y, x - y)$ ,那么距离能够表示为 $\max (|x_i - x_j|, |y_i - y_j|)$ ,因此直接取横纵坐标的极差的较大值。
计算 $A \times B = C$ ,考虑构造能快速进行的变换 $DFT(A), IDFT(A)$ ,使得 $DFT(A) * DFT(B) = DFT(C)$ ,而后就先变换,再点乘,再逆变换解决多项式乘法问题。
给定 $z$ ,求方程 $x ^ 2 + y ^ 2 = 2 z ^ 2$ 的解,考虑令 $u = x - y, v = x + y$ ,那么 $u ^ 2 + v ^ 2 = z ^ 2$ ,对这个方程解出来,再求得本来的 $x, y$ 。
(1)拉格朗日定理:n 次多项式 f(x) = 0 (mod p), p not div a[n] ,最多有 n 个解。
证实:假设有 n+1 个根,那么能够写做 f(x) = (x - x0) g(x) ,那么 g(x1, x2, ..., xn) = 0 ,根据概括假设矛盾。
(2)推论一:n 次多项式 f(x) = 0 (mod p) 超过 n 个解,则 p | a[1], a[2], ..., a[n] 。
(3)推论二:d | p-1 ,则 x ^ d = 1 (mod p) 有 d 个解。
证实:根据费马小定理,x ^ {p - 1} - 1 = 0 (mod p) 有 p-1 个解,而 x ^ {p - 1} - 1 能够分解为 x ^ d - 1 和 g(x) ,两部分的解的个数都取满,且交集为空。
(4)n 次多项式 f(x) = 0 (mod p), p not div a[n] 有 n 个解,当且仅当 f(x) 是 x ^ p - x 在模 p 意义下的因式。
证实:
当有 n 个解时,设 x ^ p - x = g(x) f(x) + r(x) ,由于解 x1, x2, ..., xn 也是 x ^ p - x 的解,因此 r(x1, x2, ..., xn) = 0 ,而 r 是 n-1 次的,因此 r(x) = 0 (mod p) 。
当 g(x) f(x) = x ^ p - x 时,因为 x ^ p - x 的解有 0, 1, ..., p-1 ,达到了上限,因此 f(x) 有 n 个解。
(1)「ARC 097F」Monochrome Cat
题意:给定一棵 100000 个点的树,每一个点最初的颜色是黑色或白色,最初你能够降临在某个点,每次能够反转当前点的颜色,或者走到一个相邻点并反转这个点的颜色,问最少走多少次才能使得全部点的颜色为黑色。
分析:考虑树形 DP ,f[x -> y], g[x -> y] 表示第一步从 x 走到 y ,而后在 y 的子树中走若干步,使得全部点的点权为黑色,并回到根节点 / 不回到根节点的最少步数。状态数为 2(n-1) 。最后只须要枚举降临到哪一个节点,均摊 O(1) 算 g[0 -> x] 。
(2)「YWW 模拟赛」
题意:给定 n 个点的一棵树,边带向,问以每一个点为根构建树形图,须要改变多少条边的方向。
分析:直接 DP ,累加子树中的反向边树,最后枚举每一个点做为根,而后直接用 2(n-1) 个状态中的某些凑出这个点为根时的答案。
(3)小结:
这种写法的好处在于:
(1)COT3
(2)「THUWC 2018」求 100000 个点的树的不超过两种颜色的连通块个数。
$f(x, i)$ 表示以点 $x$ 为根的子树中,另一种颜色为 $i$ (能够不出现)的非空连通块的个数,而后用线段树合并进行优化。
(3)求一棵 100000 个点,点权在 100000 之内的树的全部链的最长 LIS 。
维护以每一个点为根的子树中,从下往上,最后一个值为 w 的 LIS f[x][w] ,以及 LDS g[x][w] ,考虑线段树合并的过程当中更新答案,再特殊加入最后一个值为 a[x] 的状况。
一个简单暴力的拓展:对每一个子树中询问全部链的最长 LIS 。
(4)小结:不要看到复杂度高,就立刻否决掉某种想法,由于可能能够优化复杂度。
(1)一种见解
积性函数能够看做每一个素因子相互独立,素因子的函数值乘起来能够获得最终的函数值。
设 $n = \prod p_i ^ {a_i}$ ,那么
$$\sum_{d | n} f(d) = \prod_{p ^ a | n} \sum_{i = 0} ^ a f(p ^ i)$$
好比说,
$$\sum_{d | n} \mu(d) = \prod_{p ^ a | n} \sum_{i = 0} ^ a \mu(p ^ i) = \prod_{p ^ a | n} (1 - 1) = [n = 0]$$
好比说,
$$\sum_{d | n} \phi(d) = \prod_{p ^ a | n} \sum_{i = 0} ^ a \phi(p ^ i) = \prod_{p ^ a | n} (1 + (p - 1) \sum_{i = 0} ^ {a - 1} p ^ i) = \prod_{p ^ a | n} p ^ a = n$$
好比说,
$$\sum_{d | n} \mu(d) d = \prod_{p ^ a | n} \sum_{i = 0} ^ a \mu(p ^ i) p ^ i = \prod_{p ^ a | n} (1 - p)$$
(2)若 $f, g$ 是积性函数,则 $f * g$ 也是积性函数,这里的 * 是点乘。
相关:
若 f 是积性函数,f ^ -1 也是积性函数。
若 f 是积性函数,$f \times g = h$ ,则 g 是积性函数当且仅当 h 是积性函数。
(3)原创题
题意:给定 $n, k$ ,定义数论函数 $f(x) = \sum_{d | x} \mu(d) d ^ k$ ,请你求出
$$\sum_{i = 1} ^ n \sum_{j = 1} ^ n f(\text{lcm}(i, j)) f(\gcd(i, j)) \mod 998244353$$
分析:
$$f(x) = \sum_{d | x} \mu(d) d ^ k = \prod_{p | x} (1 - p ^ k)$$
考虑 lcm(i, j) 中包含了 i 和 j 的素因子的并,gcd(i, j) 包含了 i 和 j 的素因子的交,因此
$$f(i)f(j) = f(lcm(i, j)) f(gcd(i, j))$$
$$answer = \sum_{i = 1} ^ n \sum_{j = 1} ^ n f(i) f(j) = (\sum_{i = 1} ^ n f(i)) ^ 2$$
以后就是一个经典的分段求和、杜教筛。
(1)最小环的相关问题
「GDOI 2018」无向图,过点 x 的最小环:以点 x 为原点求 dij ,找到一个最短路生成树。一个最小环必定包含一条非树边。进一步考虑 LCA 不为源点的非树边,必定存在更优秀的解。因此对全部 LCA(x, y) = 1 的非树边,用 dist(1 -> x) + w(x -> y) + dist(y -> 1) 更新答案。
无向图最小环:枚举环上最大的点 x ,以及相邻点 y, z ,用 w(x -> y) + (从点 y 到点 z ,只通过 < x 的中转点的最短路)+ w(z -> x) ,因此一边 Floyd 一边更新答案。
有向图,过点 x 的最小环:以点 x 为原点求 dij ,找到一个最短路生成树,直接枚举环上的最后一个点 y ,那么点 y 以前的路径必定是从 x 到 y 的最短路。
有向图最小环:Floyd ,最初 f[i][i] = INF 。
(2)传递闭包问题
Floyd,O(n ^ 3 / 32) 。
缩点求 SCC ,在 DAG 上记忆化搜索,O(nm / 32) 。
「2014 ACM / ICPC Rregional Beijing」:给定一张无向图,每次删除某个点及其后继,问指望多少次全部点被删完。利用线性性质,考虑每一个点被删除的几率,也就是 1 / 它的前驱个数 。因此考虑反向建图,而后求传递闭包。时间复杂度为 $O(\frac{nm}{32})$ ,空间复杂度为 $O(\frac{n ^ 2}{32})$ 。若是会 MLE ,那么考虑每次处理 $T$ 位,空间被优化为 $O(\frac{n T}{32})$ ,可是常数会增大。
「论文题」最大异或路径:给定一张 100000 个点的有向图,每一个点有 100000 之内的点权,询问全部点 x 是点 y 的前驱,a[x] xor a[y] 的最大值。把 Trie 树改成长度为 100000 / 32 的布尔数组,每次查询前预处理块的前缀和,用来 O(1) 求区间的 1 的个数。
(3)Floyd 的拓展
每次至关于加入某个中转点进行转移。
「2016 计蒜之道复赛」200 个点的无向图,枚举全部的 x, y, z ,求从点 x 到点 y ,不通过点 z 的最短路。考虑分治,每次加入左边的中转点,分治到右边,加入右边的中转点,分治到左边。
加入中转边 (x, y) ,也能够处理。设 f[][] 表示原图的传递闭包。加入边 (x, y) ,若 f[x][y] ,那么这条新加的边就废了,不然对全部能到达 x ,不能到达 y 的点,向 y 的全部后继连边。能到达 x ,不能到达 y 的点,至关于 anc(x) cap (V - anc(y)) ,因此须要维护 anc ,而 anc 至关于补图的 succ 。单次执行的复杂度为 $O(\frac{n ^ 2}{32})$ ,总复杂度为 $O(\frac{n ^ 3}{32})$ (这优于每次执行的复杂度上界相加)。
能够 Floyd 能够比较好的支持加入单点,以及撤销,因此对于又要加、又要删的问题,能够考虑用时间线段树进行分治。
(1)
(2)n 个点的竞赛图必定存在一条哈密顿路径。
(3)n 个点的强连通竞赛图必定存在哈密顿回路。
(4)n 个点的强连通竞赛图存在大小在 [3, n] 之间的强联通竞赛子图,也就存在大小为 [3, n] 的简单环。
(5)n 个点的强连通竞赛图的个数。
减法原理,而后枚举最后一个强连通份量中的点的个数。
$$f(n) = any(n) - \sum_{i = 1} ^ {n - 1} any(n-i) f(i)$$
若是要作到一个 log ,考虑构建指数生成函数,
$$G = F + F ^ 2 + ... = \frac{1}{1 - F}$$
$$F = 1 - \frac{1}{G}$$
多项式求逆模板题。
(6)「NOI 模拟赛」:n 个点,至少存在一个大小为 K 的简单环的竞赛图个数。
(7)「POI 2017」:给定一个竞赛图,求从每一个点出发可以走出的最长路。
看清全部的可能性,能进能退。
换句话说:不会作的时候,要能肯定本身不会作。
切忌看着问题发呆,等着念头的降临。
切忌盲打盲撞,撞不对就满盘皆输。
题意:给定 $10 ^ 9 \times 10 ^ 9$ 的网格图,网格的边长为一,每一个单位子矩形内都有一个以中心做为圆心,半径为 $R = \frac{R_0}{10 ^ 6}$ 的点,问从左下角能看到多少个点。
式子化下来是存在 $x, y$ ,使得
$$\frac{|Bx - Ay|}{\sqrt{A ^ 2 + B ^ 2}} < R$$
要去考虑 $|Bx - Ay|$ 的最小值。
首先,应该要稳步推动,去观察求这个东西的最小值有什么可能性,应该能够从代数和几何的角度去研究,可是解决问题的关键在于观察到 $x, y$ 是整数,因此这其实是个数论问题。
其次,积累一点经验,定义在整数域上的函数可能会去用数论解决问题。
题意:给定一棵 $100000$ 个点的树,两我的玩游戏,Alice 先手,双方轮流将某个未染色的树的结点染成 Alice 色和 Bob 色,设最后树上有 A 个 Alice 色连通块,B 个 Bob 色联通块,Alice 要使得 A - B 最大,Bob 要使得 A - B 最小,问在最优策略下,最后 A - B 的值。
当想不到怎么作的时候,除了考虑一些特殊化、通常化、类比的辅助问题以外,还能够去考虑对问题的某个主体构建一个等价的变换,使得条件变得间接可作。
同色连通块个数,能够看做总点数 - 两边同色的边数。这个问题中总点数必定,两边同色的边数考虑再作一个变换。定义一个点的点权为度数,那么 Bob 的点权和 - Alice 的点权和 = 2 ( 双 Bob 色边数 - 双 Alice 色边数 ) 。
一个相似的问题:给定一棵 100000 个点的树,每条边的点权在 15 之内,每次选定一条路径异或一个数 x ,问最少多少次全部边权为 0 。构建一个等价的变换,定义一个点的点权为全部相邻的边权的异或和,那么每次至关于对两个点的点权异或 x ,最终要求全部点的点权为 0 。问题能够重述为有若干个值,每次能够选择两个异或 x ,使得最终全 0 。一次异或看做一条连边,那么一个连通块就要求点权异或和为 0 。对于最优解,一个联通块确定没法分解,因此至少须要 n-1 次连边,而 n-1 次连边能够构造获得。因此最终所求就是划分红若干个连通块,使得 n - 连通块个数最大,因此连通块个数最多。若是一个数出现了 x > 2 次,则能够将 2 个组队,最后保证每一个数只出现一次,而后状压 DP 。
题意:区间 and ,区间 or ,区间最大值。
考虑线段树,若是一个区间的某个要修改的位置已经全同样了,那么修改完仍是全同样的,并且最大值能够直接维护,因此考虑延时。
用位运算把一个 log 给优化。
考虑用两个 tag :same, appoint ,same 表示哪些位置同样,appoint 表示钦定这些位置的值为 0 / 1 。我就卡在用了一个三进制的 tag 。
一个相似的问题:区间 and ,区间 or ,区间 xor ,单点查询。能够拆位来作,两个 log 。能够打 tag ,表示为 and A or B xor C ,而后一个 log 。
一个相似的问题:区间 and ,区间 or ,区间 xor ,区间求 xor ,区间求和。直接拆位,开 20 个线段树。
题意:40 个变量 X = {0, 0, 0, ..., 0} ,10 次操做,第 i 次操做有 p[i][j][k] 的几率将 x[j] 增长 k ,k 属于 [0, C], C 不超过 4 ,问全部操做后的最大值的指望。
场上连 m = 10 ,能够设计状压算法都没有发现,真是菜得不行。。。首先,仍是要加强本身的洞察力,要修炼。其次,对题目有清晰的理解,把已知、条件、未知分行写下来以后,要对每一个细节进行考虑,包括了已知量的数据范围给的信息。
还有就是 DP 的时候,考虑设置的状态是一个前缀,设 f[i][j][k] 表示最大值不超过 j ,而不是等于 j ,否则转移的时候还须要前缀和(事实上,我就是经过须要用前缀和优化转移,才想到前缀和的意义,进而用前缀和直接转移)。
题意:有 1e6 个圆盘,有三个塔,给定起始状态、终止状态,求最少移动次数。
考察分析能力。
改编:有 1e6 个圆盘,三个塔,给定起始状态、终止状态,每次只能移动到相邻的一座塔,求最少移动次数。
题意:给定长度为 1e6 的序列,每一项在 1 到 n 之间,求最大的 k ,存在一个连续子序列,为 [1, k] 的排列。
按照常规的想法并不容易想到,可是应该要在失败中发现可能性。(1)若是只是由于复杂度的问题,那么能不能优化,优化能够考虑分治、分块、数据结构之类的。(2)哪一个地方,最有可能让我发现新的意义?对于一个肯定的 k ,思考怎么判断如何存在一个 [1, k] 的排列?我只会用 Hash 的方法进行判断,而后还不能二分 k ,可是这个细节的意义太少了,应该没有挖掘完。所以从这里入手,再仔细想一想,或许就能发现:一个长度为 k 的序列是 [1, k] 的排列,当且仅当不存在重复的数字,且和为 k * (k + 1) / 2 。
题意:给定一棵 100000 个点的树,以及若干个点的点权,请填写剩下的点的点权,使得有边相邻的两个点的点权差值在 1 之内。
考虑先松弛,实现上就是从下往上松弛,从上往下松弛,由于确定不会回头松弛,松弛过程出现 emptyset 就直接输出 -1 。而后对于相邻的两个点,限制为 [L1, R1], [L2, R2] ,就有 L2 <= L1 - 1, L1 <= L2 - 1 ,即 |L1 - L2| <= 1 ,因此直接取左端点的点权就构造完成了。
这是松弛操做在序列、树上的一类特殊问题。
序列:n 个点,点 i 和点 i+1 之间的边权为非负整数 a[i] ,从超级源点 S 到每一个点有一个距离 d[i] ,问从超级源点 S 走到每一个点的最短路。
树:n 个点构成一个树,每条边的边权非负,从超级源点 S 到每一个点有一个距离 d[i] ,问从超级源点 S 走到每一个点的最短路。
题意:在 w × h 的矩形内,有 100000 个点,找到一个不包含任何点的周长最大的矩形。
首先要发现一个答案的下界:2 * (max(w, h) + 1) ,设答案长为 a ,宽为 b ,则必定有 a > w / 2 或 b > h / 2 ,因此必定过 x = w / 2 或 y = h / 2 。而后没发现也没关系,多一个 log 去分治吧。对于一个最值问题来讲,能够考虑去 DP ,能够二分或枚举,能够比较决策点的优劣,或者发现最优决策点所具备的特性。而这道题给个人启发是,出发点能够是去考虑一些特殊的解,找到答案的一个界,再和其余的决策点进行比较,或许就能发现最优决策点的一些性质。
我也想过度治啊,然而仍是想不到,由于我考虑必定过 x / 2 ,而后把坐标按照 x 的顺序来进行扫描。。。实际上应该按照 y 来扫描。。。对于二维平面上的点进行扫描,能够横着扫描,也能够竖着扫描。。。。
知道要扫描,那么以后直接移动一下端点,维护一个答案就行了。然而我不会实现啊。。。如今能口述一遍实现吗?
题意:
1e7 × 1e5 的数表,知足对于 $i > 1$ ,有
$$f(i, j) = a \times f(i-1, j) + b \times f(i-1, j-1)$$
给定数表的某一行,100 组询问,求某个位置的值 mod 998244353 。
(1)利用一个式子来求逆元
能够推出
$$\frac{f(x+1, y)}{a ^ x} = \sum_{i} f(1, i) \binom{x}{y - i} (\frac{b}{a}) ^ {y - i}$$
$\binom{x}{i} (\frac{a}{b}) ^ i$ 的逆元是什么。。。场上我直接用多项式求逆了,而后这个能够直接利用下面这个式子来求逆元。
$$\frac{1}{1 - x} = \sum_i x ^ i$$
$$\frac{1}{(1 - x) ^ n} = \sum_i \binom{i + n - 1}{n - 1} x ^ i$$
$$\frac{1}{(1 + x) ^ n} = \sum_i \binom{i + n - 1}{n - 1} (-1) ^ i x ^ i$$
考虑 $\binom{p}{i} (\frac{a}{b}) ^ i$ 的生成函数,为
$$\sum_i \binom{p}{i} (\frac{a}{b}) ^ i x ^ i = (\frac{a}{b}x + 1) ^ p$$
$$\frac{1}{\sum_i \binom{p}{i} (\frac{a}{b})} ^ i x ^ i = \sum_i \binom{i + n - 1}{n - 1} (-1) ^ i (\frac{a}{b}) ^ i x ^ i$$
(2)既然我能够用第一行来求。。。事实上我知道任意一行,就能够用这一行,利用组合意义来推导出其余某行的某个位置的值了啊。。。
(3)一道相似的题:Frightful Formula,更巧妙的是,那道题获得了一个含组合数的数字,能够设计与组合数的指标相关的 DP 。
题意:给定二维平面上的 n 个点,选择两个点,使得两点斜率的绝对值最大。
按照点的坐标进行排序,考虑相邻两个点就行了。证实的话,考虑最优的决策点须要知足的性质,若是中间存在一个点,画画图就会发现有更大的。以为挺巧妙的,分享一下。。。
题意:
给定 2e9 范围内的整数 $a, b, c, d, A, B$ ,
$$\text{maximize} ~ Z = x + y \\ \begin{pmatrix} a & b \\ c & d \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} \le \begin{pmatrix} A \\ B \end{pmatrix}$$
分析:
如今至关于要在过第一象限、朝左下方向的两个半平面与第一象限的交内,找到 $x + y$ 最大的整点,那么 $y_{\max}$ 是关于 $x$ 的带取整符号的分段函数,对每一段进行讨论,至关于要最大化
$$x \in [l, r], x + \lfloor ax + b \rfloor$$
因为 $x$ 是整数,能够将 $x$ 放进取整符号内,而后就能够先看成一次函数作,而后再取整了,时间复杂度为 $O(1)$ 。
题意:定义 $S = T$ 当且仅当存在一个字符之间的双射,进行变换后 $S$ 和 $T$ 能彻底重合。给定一个字符串 $S$ 和一个字符串 $T$ ,找到有多少个 $S$ 的子串等于 $T$ 。
魔改 KMP 。
一个相似的问题,USACO Cow Pattern:定义 $S = T$ 当且仅当每一个位置的字符在整个字符串中的 rank 值相同,找到有多少个 $S$ 的子串等于 $T$ 。作法相似,不过须要使用两个树状数组来维护匹配时的 rank 。
题意:有 8 个点到原点的距离分别为 r1, r2, ..., r8 ,请安排这 8 个点的位置,最大化这些点构成的凸包的面积。
(1)二元函数 $f(x, y)$
它的图像是什么?我看到的是一座山的模型。就是对于每一个坐标来讲,都有一个高度,并且是连续的。
偏导是什么?对于某个点 $x, y$ ,当 $x$ 要发生微小移动却尚未移动时,$y$ 想移动的方向就是偏导(这是一条直线),当 $y$ 想要发生微小移动却尚未发生时,$x$ 想移动的方向也是偏导。
对于两个二元函数相切的位置,想要移动的方向是一直的,因此偏导成倍数关系,$\delta f_x = \lambda \delta g_x, \delta f_y = \lambda \delta g_y$ 。
(2)拉格朗日乘数法
考虑一个简单的问题,
$$\text{maximize} ~ z = x ^ 2 + y ^ 2 \\ s.t. ~ xy = 3$$
能够看做有一个盆地,你要找到一个高度最低的横截面,使得这个横截面与 $xy = 3$ 有交。想象三维空间内从下往上扫描,横截面从没有交点、到某个时刻有两个交点、再到以后有四个交点。。。我须要找的就是有两个交点的时刻,也就是 $z = x ^ 2 + y ^ 2, (\forall z, xy = 3)$ 的相切的地方,因此就能够列出交点知足的三个关系:
$$xy = 3 \\ 2x = \lambda y \\ 2y = \lambda x$$
因此当 $x = y = \sqrt 3$ ,$z$ 取得极值 $6$ 。
通常化的,对于
$$\text{maximize} ~ f(x_1, x_2, ..., x_n) \\ s.t. ~ g(x_1, x_2, ..., x_n) = k$$
能够转化为求全部极值点,极值点知足
$$f_{x_i} = \lambda g_{x_I} \\ g(x_1, x_2, ..., x_n) = k$$
(4)特殊情形
$$\text{maximize} ~ f(x_1, x_2, ..., x_n)$$
那么至关于对全部偏导要等于 $0$ 。
(3)分析:枚举凸包上的点和顺序,而后用拉格朗日乘数法就解决啦。
(1)区间排序:内部维护线段树,外部用 set 维护全部的树的根节点。
(2)乘积的最高位:考虑 log10 ,而后小数部分;或者 double 直接作,保证始终 < 10 。
只作了三道题。。
(1)A 题:给定 A, B, C(1e9),进行 K(1e18) 次操做,每次将每一个数变成另外两个数的和,问 K 次操做后 A-B 的值。
考虑 A - B, B - C, C - A 的变化,发现会取相反数,因此作 K & 1 次就行了。
(2)B 题:给定一个 1 到 2e5 的排列,每次能够将某个数放到序列的最前面或最后面,问最少多少次能变成 1 .. n 。
最后剩下的必定是连续一段,操做次数为 n - 连续一段。而对于任意连续一段,显然能够构造使得它们最后剩下。因此找到最长的一个子序列,知足数值连续。
(3)C 题:最初有 0, 0, ..., 0 ,每次能够将 a[x+1] 变为 a[x] + 1 ,问可否变成最终的 b, 以及最少操做次数。
从前日后,每次找一段连续上升的,设长度为 re ,下一个为 x ,一个必经状态是 x 的前 x 个为 0, 1, ..., x ,这确定在 re 这些以前进行,因此判断 re 和 x 的大小关系,答案加上 re - 1 。
围观了一些楼下作的题。
(1)排序:给定 $[1, 2 ^ n], n = 12$ 的排列,对于每一个 $0 \le i < n$ ,对应将序列划分为 $2 ^ {n - i}$ 个大小为 $2 ^ i$ 的段,而后交换其中两段的操做,每种操做最多只可使用一次,问有多少个操做序列能将排列排序。
须要一点点分析能力吧,而我连这点分析能力都很不具有。首先,要注意到操做顺序并不影响最终,若是有 $use$ 个操做,那么这个操做对应着 $use!$ 个操做序列。考虑对 $i$ 从小到大进行操做,那么作完操做后,必定要合成若干个大小为 $2 ^ {i + 1}$ 的连续段,找到当前有 $tot$ 个大小为 $2 ^ {i + 1}$ 的段不知足要求,若 $tot = 0$ ,那么继续,若 $tot = 1$ ,那么交换这个段的先后两部分,若 $tot = 2$ ,分四种状况进行讨论,而后继续 DFS 。
(2)征途:$n = 3000$ 条道路,$m$ 天从 $0$ 走到 $n$ ,最小化这 $m$ 天走的距离的方差。
$$Var(x) = E((x - E(x)) ^ 2) = E(x ^ 2 - 2 x E(x) + E(x) ^ 2) = E(x ^ 2) - E(x) ^ 2$$
对于离散的状况,设 $s1$ 为全部数的和,$s2$ 为全部数的平方和,总共有 $n$ 个数,
$$Var(x) = E(x ^ 2) - E(x) ^ 2 = \frac{s2}{n} - \frac{s1 ^ 2}{n ^ 2}$$
(3)配对:有 $200$ 种数,每种数值为 $a_i({10} ^ 9)$ ,个数为 $b_i({10} ^ 5)$ ,价值为 $c_i(|{10} ^ 9|)$ 。若数 $i, j$ 知足 $j \mid i$ ,且 $i / j$ 是质数,则能够配对,并贡献 $c_i \times c_j$ 的价值。进行尽量多的配对,使得价值之和大于 0 。
能够配对的数之间进行连边,发现能连边的数的指数之和差一,因此能够按照指数之和的奇偶性分类,那么就是一个二分图。
剩下的问题就是二分图匹配,边带边权,要求权值之和大于 $0$ ,考虑跑最大费用流,那么就取费用 > 0 的最后时刻的匹配个数。
(一)连通图计数
(1)$n$ 个点的连通图计数。
连通的话,能够去考虑从总体上看,或者用总的方案减去不连通的图的个数。
一种想法是直接利用指数生成函数,
$$G = e ^ F$$
$$F = \ln G$$
而后就直接 $O(n \log n)$ 。
第二种想法是去容斥,考虑斯特林反演,
$$f(n) = \sum_{s_1 + s_2 + ... + s_m = n} (-1) ^ {m - 1} (m - 1) ! \binom{n}{s_1, s_2, ..., s_m} \prod_{i = 1} ^ m 2 ^ {\binom{s_i}{2}}$$
这个作法的话我就只会 $O(n ^ 2)$ 的 DP 了,想不到怎么处理 $(-1) ^ {m - 1} (m - 1) !$ 。
第三种想法,考虑怎么计算不连通的图的个数,那就枚举一号点所在的联通快的大小,
$$f(n) = g(n) - \sum_{i = 1} ^ n \binom{n - 1}{i - 1} f(i) g(n-i)$$
复杂度为 $O(n \log ^ 2 n)$ 或 $O(n ^ 2)$ 。
(2)$n$ 个点 $m$ 条边的图有多少个边的子图是连通图。
第一种想法,考虑斯特林反演,复杂度为 $O(Bell(n) n ^ 2)$ 。
第二种想法,考虑用总的方案减去不连通的方案,设 $f(S)$ 表示 $S$ 的诱导子图有多少个边的子图是连通图,$g(S)$ 表示 $S$ 的诱导子图有多少边的子图不是连通图。
$$f(S) = 2 ^ {ways(S \to S)} - g(S)$$
$$g(S) = \sum_{T \subset S, T \ne \emptyset} f(T) g(S - T)$$
(二)DAG 计数
考虑 $n$ 个点的 DAG 计数,DAG 能够不重不漏地描述为:按照以前的点到该点的最大距离分层,每次添加一层点。
因此考虑枚举下一层有哪些点,并贡献容斥系数,
$$f(n) = \sum_{i = 1} ^ n (-1) ^ {i - 1} \binom{n - 1}{i - 1} f(n - i) 2 ^ {(n - i) \times i}$$
(三)强连通图计数
$n$ 个点的强连通图有多少个?
用有向图的个数减去不是强连通的图的个数,不是强连通的图,缩点以后是一个 DAG ,因此对这个 DAG 进行 DP 。
$$f(n) = 2 ^ {n (n - 1)} - \sum_{i = 1} ^ n \binom{n - 1}{i - 1} f(n - i) 2 ^ {(n - i) \times i} g(i)$$
其中 $g(n)$ 表示 $n$ 个点的由奇数个强连通图组成的图的个数减去 $n$ 个点的由偶数个强连通图组成的图的个数。
$$g(n) = - \sum_{i = 1} ^ {n} f(i) g(n - i)$$
(四)双联通图计数
$n$ 个点 $m$ 条边的一个图,有多少个边的子集构成的图是边双联通图?
考虑用连通图的个数减去不是边双联通的连通图的个数,不是边双联通的连通图在缩点以后能够看做一棵树。
这时候一种可能性是枚举这棵树的每个点,对每一个点先进行好 DP ,而后用 Matrix-Tree 计算一下把它们连成一棵树的方案数。
第二种可能性是能够描述为找到标号最小的点所在的新点做为根节点,而后将其余的接到当前点,其余的接到当前点也能够 DP 。
设 $ways(S, T)$ 表示把 $T$ 中的接到 $S$ ,则
$$ways(S, T) = \sum_{T' \subset T, \min T \in T'} ways(S, T - T') \times \text{T' 有多少个子图是连通图} \times \text{T' 到 S 的连边数量}$$
太菜了要打点板子,练了两个板子,都是这道题,看似是 xjr 的学校的 OJ 。。。
http://zijian-lv.com/problem/3
题意:2e6 个点的树,2e6 组询问,求某个子树内距离 >= k 的全部点的点权和。
板子一:DSU ,须要卡一卡常。
关于实现复杂度,每一个点须要被遍历到该点向上的轻边次,而走一次轻边子树大小至少翻一倍,因此 $O(\log n)$ 条轻边,总复杂度就是 $O(n \log n)$ 。
void DSU(int x, int dep, int ReM) { Fore(x) if (v != son[x]) DSU(v, dep + 1, 0); if (son[x] != x) DSU(son[x], dep + 1, 1); ad(dep, + a[x]); Fore(x) if (v != son[x]) Put(v, dep + 1, +1); LL Sn = qr(MX); for (int k2 = hd2[x]; k2; k2 = qs[k2].nx) { int k = qs[k2].k, id = qs[k2].id; ans[id] = dep + k <= MX ? Sn - qr(dep + k - 1) : 0; } if (! ReM) CLR(x, dep); }
板子二:长链剖分
考虑一个点何时会枚举它的全部深度,那么就是它和它的父亲不在一条长链上,因此每条长链只有根节点会贡献链长的复杂度,把复杂度分配到每一个点,那么每一个点有且仅有一点复杂度,因此时间复杂度为 $O(n)$ 。
实现的时候注意怎么动态开数组,new int [=_=] 。
题意:给定一个长 1e5 的字符串以及若干个它的子串,Alice 和 Bob 又在玩游戏,Alice 先手,轮流操做,每次能够将一个字串在末尾添加一个字符,使得还是子串,谁不能操做谁输。
继续练板子,后缀自动机 + SG 函数。
今天好像都是傻叉题。。。我交完开头四法,8 点钟的时候就直接弃了提答去作其余东西了。。
(1)Escape:给定一棵树,每一个点有点权,对每一个点 x ,求
$$\sum_y [dis(1, x) \ge dis(1, y)] a_y$$
每一个点会贡献到一个子树,因此直接用 DFS 序 + 前缀和,$O(n)$ 水过。
(2)Machine:给定 $f(1), f(2), ..., f(10 ^ 5)$ ,$1000$ 组询问,求
$$(f \times I \times I \times ... \times I)(x), x \le {10} ^ 5, k \le {10} ^ 5$$
根据组合意义,
$$x = \prod p_i ^ {a_i}$$
$$I ^ k(x) = \prod \binom{a_i + k - 1}{k - 1}$$
总之也算是积累了 $I ^ k(x)$ 的意义吧。
\documentclass{beamer}
\usepackage{ctex}
\begin{document}
\title{yww 太强了}
\author{Sdchr}
\maketitle
\begin{frame}{主标题}{副标题}
yww 天下第一
\end{frame}
\begin{frame}[t]{主标题}{副标题}
yww 天下第一
\end{frame}
\end{document}
其他东西遇到现场学。
首先是经典的 NIM 游戏。对于 $xorsum \ne 0$ ,必定可以把某个数减少使得 $xorsum = 0$ ;对于 $xorsum = 0$ ,任意一种变化都会使得 $xorsum \ne 0$ 。先手必胜当且仅当 $xorsum \ne 0$ 。
关于 NIM 游戏,我还想到了这样一个问题:判断先手必败仍是必胜?第一步有多少种操做方案能使得先手必胜?要找的数知足 $a_i ~ xor ~ s < a_i$ ,能够直接考虑 s 的 highbit ,ai 知足要求当且仅当当前这位是 1 ,直接用大小为 32 的数组维护一下。因而我就能够出一些 NIM 与 Trie 结合的问题,好比说:给定一个长度为 1e5 的序列,1e5 次操做,每次操做要么单点修改,要么区间查询 NIM 游戏的胜负,若能胜,有多少种方法能胜。
接下来是阶梯博弈的问题。若奇数层的异或和等于 $0$ ,那么后手有策略必胜,他的策略是,若另外一方把偶数层的移到奇数层,那么他就把这些再往前移一层,若另外一方移动奇数层的移动到偶数层,那么至关于在某堆石子中取掉一些,对应的玩一玩 NIM 游戏就行了。而若奇数层的异或和不等于 0 ,那么先手能玩一玩 NIM 使得异或和为 0 ,而后用以前的解释,先手就必胜了。因此先手必胜当且仅当奇数层的异或和不为 0 ,后手必胜当且仅当奇数层的异或和为 0 。
阶梯博弈的模型能够推广到树上,取全部奇数层的点玩 NIM 游戏就行了。
洛谷五月月赛,取石子:有 n 堆式子,第 i 堆有 a[i] 个,最初保证 a[i] >= a[i-1] ,每次能够将某堆 a[i] > a[i-1] ,将第 i 堆移走一个,A 先操做,双方轮流操做,谁不能操做谁输,问谁赢谁输。取差分,考虑奇数位置的和的奇偶性,推理思想和阶梯 NIM 一致。
冬令营模拟赛,养分餐:给一棵树,每一个点有点权 $a_i, b_i$ ,最初保证 $a_i \ge \sum_{(i, v)} a_v \times b_v$ ,每次能够将某个 $a_i$ 减一,问谁赢谁输。取 $c_i = a_i - \sum_{(i, v)} a_v \times b_v$ 。取差分,而后推理思想和阶梯 NIM 同样。
BZOJ 1115:取差分,而后玩阶梯 NIM 。
我在想一个问题,阶梯博弈能不能推广到通常的图上?通常图感受没有但愿,那就考虑一种特殊的图——二分图。而后我就能够设计这样一个问题:有 $n$ 个点的一张图,每一个点上有 $a_i$ 个石子,每次能够选定一个点 $x$ ,而后将点 $x$ 上的若干个石子,能够移动到点 $x / prime$ 上,问谁能赢?这时候会发现,阶梯 NIM 的思想仍然能成立——对于指数之和为偶数的点,先手移动了,后手也移动;对于指数之和为奇数的点,至关于玩 NIM 。
接下来,今天我也补全了对 SG 函数的一些理解。在 ICG 模型中,能赢当且仅当异或和不为 0 。这里的证实与阶梯 NIM 也是相似的。设异或和为 S 。若 S = 0 ,则后手有必胜策略:当先手将某个值为 $x$ 的地方的石子移动到某个值为 $y$ 的地方,那么确定有 $x \ne y$ ,若 $x > y$ ,那么玩 NIM 游戏,若 $x < y$ ,那么能够将这个石子取回到一个值为 $x$ 的地方。反之 $S \ne 0$ ,先手有必胜策略。
$$\ln (1 - x) = - \sum_{i \ge 1} \frac{x ^ i}{i}$$
证实:
$$F(x) = \ln (1 - x)$$
$$F'(x) = - \frac{1}{1 - x} = - \sum_{i \ge 0} x ^ i$$
$$F(x) = - \sum_{i \ge 1} \frac{x ^ i}{i}$$
对于多项式连乘的形式,好比说
$$F(x) = \prod_{i = 1} ^ n {(1 - a_i x ^ {b_i})} ^ {c_i}$$
若是指数之和不大,那么能够分治 FFT 求。
若是形如 $(1 - a_i x ^ {b_i}) ^ {c_i}$ 连乘,就可能能够先求 ln 后的值,再取 exp :
$$
F(x) = \prod {(1 - a_i x ^ {b_i}) }^ {c_i}
$$
$$\ln F(x) = \sum c_i \ln (1 - a_i x ^ {b_i}) = \sum - c_i \sum_{j \ge 1} \frac{a_i ^ j x ^ {b_i j}}{j} = \sum_t x ^ t \sum_{b_i j = t} \frac{- c_i a_i ^ j}{j}$$
题意:给定长度为 $n \le {10} ^ 5$ 的数组 $A$ ,以及长度为 $m \le {10} ^ 5$ 的数组 $B$ ,对 $t = 1, 2, ..., {10} ^ 5$ ,求在 A, B 中分别随机取一个数时,$(a_i + b_j) ^ t$ 的指望。
$$E({x + y} ^ t) = \sum_i \binom{t}{i} E(x ^ i) E(y ^ {t - i})$$
问题变为,对于 $t = 1, 2, ..., n$ ,求出
$$f(t) = n E(x ^ t) = \sum_{i = 1} ^ n a_i ^ t$$
考虑构建 OGF ,则有
$$
F(x) = \sum_{t \ge 0} \sum_{i = 1} ^ n a_i ^ t x ^ t
$$
尝试对 $F(x)$ 构建一个多项式到多项式的变换,这个变换及其逆变换可以快速实现,而后能用对 exp 快速处理,而后取 ln 的方法来计算新的多项式 $G(x)$ 。
$$
G(x) = n + \sum_{t \ge 1} \frac{- 1}{t} \sum_{i = 1} ^ n (a_ix) ^ t = n + \sum_{i = 1} ^ n \ln (1 - a_i x)
$$
$$
H(x) = \sum_{i = 1} ^ n \ln (1 - a_i x)
$$
$$
e ^ {H(x)} = \prod_{i = 1} ^ n (1 - a_i x)
$$
对于要计算函数 $f$ 的若干项,能够考虑多项式,从总体上来考虑这个问题,包括了 OGF 和 EGF ,甚至可能对 OGF 或 EGF 进行一个等价的变换,而后计算变换后的东西的多项式,而后再进行逆变换。
对于多项式连乘,能够考虑分治 FFT 。对于多项式连乘,或者多项式连加,若是复杂度爆炸,那么能够考虑计算取对数 / 取指数后的值,而后再进行 exp 或 ln 。
能够解决天然数幂求和,给定 $n$ ,对 $t = 1, 2, 3, ..., 100000$ ,求
$$S_t(n)$$
然而并无什么用,用伯努利数完虐。
而后我发现能够进行一个加权,对序列 $A$ 的每一个位置,除了 $a_i$ 外,再定义一个 $c_i$ ,要求 $t = 1, 2, ..., 100000$ ,求
$$S_t(n) = \sum_{i = 1} ^ n c_i a_i ^ t$$
事实上这个加权的推广是我从连乘的通常形式反推过来的,因此应该也不那么容易找到其余推广了。
求
$$S(k, n) = \sum_{i = 0} ^ {n} i ^ k$$
考虑构建 $k$ 的指数生成函数,
$$F(x) = \sum_{k \ge 0} \sum_{i = 0} ^ n i ^ k \frac{x ^ k}{k!} = \sum_{i = 0} ^ n \sum_{k \ge 0} \frac{(ix) ^ k}{k!} = \sum_{i = 0} ^ n e ^ {ix} = \frac{e ^ {(n + 1) x} - 1}{e ^ x - 1}$$
下面的常数项没有逆,是否是很 GG ?实际上并没问题,由于上面的常数项也没有逆,直接将分子、分母都除掉 $x$ ,而后就有逆了。
从整体上来看,求伯努利数只须要进行多项式乘法、多项式求逆;n ^ 2 暴力的话,那就暴力求逆、暴力乘。很是方便!
YAY 跟我讲这玩意的时候,直接跟我讲一个简单的推广,
$$S(k, n) = \sum_{i = 0} ^ n (ai + b) ^ k$$
题意:有 $n = 10 ^ 5$ 个点,每一个点 $i$ 向 $[i - x_i, i + x_i]$ 连边,定义两点距
$$dis(i, j) = \min(i \to j, j \to i)$$
求 $\max dis(i, j)$ 。
怎么想都不会作,,,以为药丸了。。。问题又转化不了,只好开始想辅助问题。。。$n = 5000$ 怎么作,考虑从每一个点 $x$ 拓展。。容易发现拓展的始终是一个区间。设当前的区间为 $[l, r]$ ,那么再走一步,就能够走到区间 $[\min l_{l .. r}, \max r_{l .. r}]$ ,这样就能够不断拓展,直到拓展满,同时求出全部的 $x \to i$ 。。。拓展的始终是一个区间,这看起来颇有用。。。从新考虑一下 $maxdis$ 的意义,那么就是最小的时间,知足对于任意的 $i < j$ ,都有 $r_i < j$ ,或 $l_j < i$ 。。。先考虑若是求得了 $l, r$ 数组,怎么断定是否知足要求?考虑对每一个 $i$ ,要求 $i < j$ 的 $j$ 都知足,首先 $[i, r_i]$ 之内能知足,因此对于 $j > r_i$ ,要知足 $l_j \le i$ ,因此判断 $\max l_j \le i$ 是否成立。总之,就先求一个后缀和,而后能够作到线性断定。。。最小时间的话,考虑二分答案,那么怎么求某个时候的 $l, r$ ,那么要倍增来算,那不如直接用倍增的方法来二分,复杂度就是 $O(n \log ^ 2 n)$ 了。。。
如何计算 $A ^ K$ ?求出 $A$ 的特征多项式 $f(A)$ ,而后求出 $A ^ K = A ^ K \mod f(A)$ 。
$A ^ K \mod f(A)$ 考虑利用快速幂,场上不知怎么脑抽了。。
最近好颓废啊。。。差很少半个月的超低效率。。。要哭了QAQ。。。
一个重要的条件是 $a_l \times ... \times a_r$ 是 $d$ 的倍数。对于倍数、因数、gcd 、lcm 之类的一些带有数论风格的条件,要想到素数分解。设 $d = \prod p_i ^ {a_i}$ ,那么 $a_l \times ... \times a_r$ 中每一个 $p_i$ 的个数大于等于 $a_i$ 就行了。
相似地,以前 51nod 上有一道题,要对多个数的 lcm 进行考察,进行素数分解以后,发现指数上呈 max(s1, s2, ..., sn) 的形式,而后在指数上进行 max-min 容斥,问题就变为了一系列的 gcd 的乘积。
51nod 上还有一道,就是将 $\prod a_i!$ 从大到小贪心地分解成若干个阶乘的乘积,考虑从大到小,辅助求出当前阶乘的每一个素因子的个数,因此当前这个素数能够取 min(TOT[p], HAS[p]) 个,而后再用个二项堆或者线段树或者平衡树维护一下。
找到并解决了一个相似的问题以后,包括找到了一个相关的定理并考虑完它的证实以后,这时候的思路要很是清晰:有两种想法,一种是利用这个相似的问题的思路,一种是利用这个相似的问题的结论。
我太菜了,这道题直接想怎么 DP 并不会,没有交换 K 次这个条件以后,这就是一个经典的问题了,那么要么考虑在 DP 完以后的信息作一些调整,要么考虑拓展这个 DP 的思路。我最初的想法是把 DP 完以后访问到的位置弄出来,以及没有访问到的位置弄出来,而后两者贪心交换,不幸地 WA 了,也没有其余的思路了。这时候只好考虑拓宽这个 DP 的思路,那么就直接 i, j, k, l ,表示当前走到了 (i, j) ,k 个在路径上的格子没被选择,l 个不在路径上的格子被选择。
再好比说,一个经典的问题——次短路。考虑利用最短路的结论,只可能改变最短路上的一条边,因此试着删去最短路上的一条边,而后从新作一作最短路。即利用到告终论,又利用到了思路。
(1)计算天然数幂求和模任意素数 $P$ :
$$F_m(n) = \sum_{i = 0} ^ n i ^ m \mod P$$
$$F_m(n) = \sum_i \sum_j {m \brace j} x ^ {\underline{j}} = \sum_j {m \brace j} \sum_i x ^ {\underline{j}} = \sum_j {m \brace j} \frac{n ^ {\underline{j+1}}}{j+1}$$
这时候能够作任意模数,由于连续的 $j+1$ 个数中,必定能够找到一个 $j+1$ 的倍数,直接把 $\frac{1}{j+1}$ 贡献到那个 $j+1$ 的倍数,其他只须要预处理前缀积、后缀积。
(2)这时候我又想起了之前的一些问题,也能够用这个小技巧去避免求逆元。
$$\sum_{i = 1} ^ n i$$
$$\sum_{i = 1} ^ n i ^ 2$$
其实均可以这样处理,就能够避免写求逆元了(虽然求逆元只用一行。。。)。
“断定是否存在一个数,知足XXX” ,“断定是否对于任意的数,知足XXX” 。看到这样的存在与任意的断定要比较敏感地想到——正难则反,两者其实是能够相互转化的,并且每每能带来许多新的意义。好比,如何判断一个区间中存在一个数出现的奇数次——那就判断一个区间中是否任意一个数都出现了偶数次,考虑给每一个数附上一个随机值,断定区间的异或和是否为零就行了。
区间中任意一个数都出现了偶数次。。。我发现了两种见解,直接对每一个点附上一个随机值,或者考虑前缀和数组。本质同样。
给定一棵树,每一个点有一个权,多组询问,求某条路径上出现次数为奇数的最小权。求两个01数组异或以后的 highbit 。。考虑对位建线段树,在线段树上二分。。如何判断一个区间是否每一个位置的异或值都为 0 ,考虑给每一个位置附上一个随机值 |A| ,那么 |A xor B| = |A| xor |B| ,且全部为 0 当且仅当 |A| = 0 。
这种问题出现好屡次了啊。。。whx 出过一次,wuvin 出过一次,月赛这一道,还有 uoj 192 。
(1)Kruskal 算法的证实:最终的答案必定能够经过增量构造。只须要证实每一次的增量均可以到达一个最优解。最初显然。某次转移的时候,以前已经有 w 条边了,能够到达 n-1 条边的最优解 S ,以后有 w+1 条边的状态 T ,T 能够不断地添 S - T 中的边,直到有 n-1 条边,那么 S 和最终的 T 只差一条边,S 最优,且 T 的这条边的边权比 S 小,因此 T 也最优。
(2)一个问题:每一个点有点权,每条边的边权为点权异或和,求最小生成树。
把 Trie 建出来,必然优先和内部连,T0 和 T1 有且仅有一条边,因此直接遍历 T0 和 T1 中点数比较少的一部分,在另一部分上二分,时间复杂度为 $O(n \log ^ 2 n)$ 。
求 $n$ 个点的带标号无向图的连通块个数的指望。
设 $f$ 连通,$g$ 任意,$F, G$ 为指数生成函数,
$$n ! [x ^ n] \sum_{i} \frac{i F ^ i}{i!} = n ! [x ^ n] (F \times G)$$
这道题主要提供的是指数生成函数联系任意与联通的见解,包括第一类 Stirling 列,第二类 Striling 列,Bell 数,以及一系列的连通图计数。