今天是 5 月 3 日,从今天开始每天打个卡,大概是晚上 8 点到 10 点之间更新,记录一天所学。
5 月 3 日
1、min-max 容斥
容斥应用在 min max 之间,有
$$\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]$$
【BZOJ 4036】每次生成数 $[0, 2 ^ n)(n \le 20)$ ,生成 $i$ 的概率为 $p_i$ ,问期望多少次后或和为 $2 ^ n - 1$ 。
取得所有,可以看出取得的时间的 max 。某个集合的 min 可以看做选到集合中某个的期望次数,可以转化为1除取得集合中某个的概率。
$$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 ,为了转移,方程的其中一维与组合数的下指标有关。
2、某个区间的线性基
区间 $[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 的复杂度,没想到怎么继续优化,但可以有一些常数优化。
3、「2017 Multi-University Training Contest 1」
给定一棵 $100000$ 个点的树,对所有路径上的不同色数求和。
考虑每种颜色的贡献,算经过这种颜色的路径数量,转化为算不经过这种颜色的路径数量。考虑枚举每个点,然后枚举它的后继,后继不断的进行搜索,不经过与最初枚举的点颜色相同的点,总共扫描到 $x$ 个点,贡献 $\binom{x}{2}$ ,再特殊考虑这种颜色的所有点的 LCA 外的点。可以把所有的颜色一次做,直接对这棵树进行一个 DFS ,sum[x] 表示 DFS 到当前位置时,去除掉颜色为 x 的所有 DFS 完的子树之后,总共去除掉了多少个点,只需要用这些数据来统计答案,并维护这些数据。个人觉得这道题还是蛮巧妙的。
5 月 4 日
发烧。
5 月 5 日
发烧。
5 月 6 日
半天用来发烧,半天用来学点东西。
1、2-SAT 相关
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 就不在。
2、偏序建图
「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) ,我还想不到能不能利用偏序的一些性质把复杂度优化。
3、「AGC 003d」Anticube
给定 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} 相同只是巧合。。
5 月 7 日
1、判断一个点是否在多边形内
「PE 201」:给定 1000 个三角形,判断原点在不在三角形内部。判断的方法是看是否都在同一侧,即 Ai × Ai+1 >= 0 是否都成立,或 Ai × Ai+1 <= 0 是否都成立。
原创题:给定若干种比重为 xi + yi + zi = 100% 的原料,每种原料若干,问是否能合成比重为 X + Y + Z 的生产品。保留两维,能合成的部分在凸包的内部,把上凸壳的所有点和下凸壳的所有点找出来,对于每次询问,分别在上凸壳和下凸壳上二分,求出凸壳上 x = X 对应的 Y ,然后判断是否在区间内。
一般地,如果要判断一个点是否在凹多边形内,那么就从这个点引出一条射线,若与多边形有偶数个交点,就在内部,若与多边形有奇数个交点,就在外部。
2、「2017 Multi-University Training Contest 1」
有 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$ ,对剩下的两维就有快速做法了。
3、五边形数定理
五边形数从小到大进行排序,可以描述为 ..., 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)}$$
分拆数,所有数不重复:这是上一道题的特殊化形式,可以直接用上一道题的方法做。
4、置换相关
「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$ 。
5 月 8 日
1、多路归并
给定 10 个长度为 100000 的序列,每个序列中选择一项,求和的前 100000 小。
可以考虑每次合并两个序列,取前 100000 小。第一种做法,把两个序列从小到大排序,那么每次的决策对象只有 O(n) 个,可以在一维平面上拓展,也可以在二维平面上拓展。第二种做法,注意到要满足 ij <= n ,所以只有 O(n log n) 个,把这些东西取出来,然后排序。
可以考虑直接做 K 维,直接在 K 维超几何体上 BFS ,用堆维护较优决策点,每次选择一个最优的对象拓展,然后枚举周围的点,若它的每一维都被紧密相接了,那么加入较优决策点的集合中,实现起来会有些麻烦。
「2017 Multi-University Training Contest 1」:给定一个仙人掌,求前 K 小的生成树。把仙人掌的每个环上的点权弄出来,然后就是上面的问题了。
2、「2017 Multi-University Training Contest 1」
对于每个位置 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}$ 。
3、今天基本上都在看概率生成函数,还没干完。
5 月 9 日
今天学了挺多东西的。
一、连通图与一般图计数
设某个图上的性质 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) 实现。
二、预处理第一类斯特林数行、第一类斯特林列、第二类斯特林数行、第二类斯特林列、Bell 数
第二类斯特林数:
(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)$$
六、抛硬币一类的问题,概率生成函数,2018 集训队论文第一篇
(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$ ,则停止,求结束时计数器的期望值。
从这个例子可以看出,可以通过概率或者期望来列关系式。
5 月 10 日
一、一个经典结论
元素两两不同、长度为 $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$ 。
三、51Nod 1355
题意:已知 $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)解题要有能够解题的思维,要有充分的积累。平时训练的时候就要让自己充分思考,独立思考,实在不会的时候再看一点提示,不要看所有,要充分利用这道题的价值。总结的时候要发现自己思考过程中一些不和谐的地方,以及积累一些常见的模型。
5 月 11 日
一、求 $G$ 使得 $\phi \times G = I$ ,$\times$ 是狄利克雷卷积
(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$$
二、「PE 351」Hexagonal orchards
(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$ 。
5 月 12 日
一、模为素数的高阶同余方程
(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 个解。
5 月 14 日
一、任意点作为根的树形 DP
(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$$
之后就是一个经典的分段求和、杜教筛。
四、2017 国家集训队论文《动态传递闭包问题的探究》
(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 可以比较好的支持加入单点,以及撤销,所以对于又要加、又要删的问题,可以考虑用时间线段树进行分治。
5 月 15 日
一、竞赛图相关
(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」:给定一个竞赛图,求从每个点出发能够走出的最长路。
二、思路
看清所有的可能性,能进能退。
换句话说:不会做的时候,要能确定自己不会做。
切忌看着问题发呆,等着念头的降临。
切忌盲打盲撞,撞不对就满盘皆输。
5 月 16 日
一、NOI 模拟十三:Problem B
题意:给定 $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$ 是整数,所以这实际上是个数论问题。
其次,积累一点经验,定义在整数域上的函数可能会去用数论解决问题。
二、NOI 模拟十三:Problem C
题意:给定一棵 $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 。
三、NOI 模拟十三:Problem A
题意:区间 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 个线段树。
5 月 17 日
一、NOI 模拟十四:Max
题意: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 ,不然转移的时候还需要前缀和(事实上,我就是通过需要用前缀和优化转移,才想到前缀和的意义,进而用前缀和直接转移)。
二、BJ 模拟:Hanoi
题意:有 1e6 个圆盘,有三个塔,给定起始状态、终止状态,求最少移动次数。
考察分析能力。
改编:有 1e6 个圆盘,三个塔,给定起始状态、终止状态,每次只能移动到相邻的一座塔,求最少移动次数。
5 月 18 日
一、BZOJ 3100:排列
题意:给定长度为 1e6 的序列,每一项在 1 到 n 之间,求最大的 k ,存在一个连续子序列,为 [1, k] 的排列。
按照常规的想法并不容易想到,但是应该要在失败中发现可能性。(1)如果只是因为复杂度的问题,那么能不能优化,优化可以考虑分治、分块、数据结构之类的。(2)哪个地方,最有可能让我发现新的意义?对于一个确定的 k ,思考怎么判断如何存在一个 [1, k] 的排列?我只会用 Hash 的方法进行判断,然后还不能二分 k ,但是这个细节的意义太少了,应该没有挖掘完。因此从这里入手,再仔细想想,或许就能发现:一个长度为 k 的序列是 [1, k] 的排列,当且仅当不存在重复的数字,且和为 k * (k + 1) / 2 。
二、ARC 063E:木と整数
题意:给定一棵 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 走到每个点的最短路。
三、ARC 063F:すぬけ君の塗り絵 2
题意:在 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 来扫描。。。对于二维平面上的点进行扫描,可以横着扫描,也可以竖着扫描。。。。
知道要扫描,那么之后直接移动一下端点,维护一个答案就好了。然而我不会实现啊。。。现在能口述一遍实现吗?
5 月 19 日
一、NOI 模拟十五:Table
题意:
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 。
二、计蒜客初赛:A 题
题意:给定二维平面上的 n 个点,选择两个点,使得两点斜率的绝对值最大。
按照点的坐标进行排序,考虑相邻两个点就好了。证明的话,考虑最优的决策点需要满足的性质,如果中间存在一个点,画画图就会发现有更大的。觉得挺巧妙的,分享一下。。。
5 月 20 日
一、牛客练习赛 18 :F 题
题意:
给定 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)$ 。
二、NOI 模拟十六:xiz
题意:定义 $S = T$ 当且仅当存在一个字符之间的双射,进行变换后 $S$ 和 $T$ 能完全重合。给定一个字符串 $S$ 和一个字符串 $T$ ,找到有多少个 $S$ 的子串等于 $T$ 。
魔改 KMP 。
一个类似的问题,USACO Cow Pattern:定义 $S = T$ 当且仅当每个位置的字符在整个字符串中的 rank 值相同,找到有多少个 $S$ 的子串等于 $T$ 。做法类似,不过需要使用两个树状数组来维护匹配时的 rank 。
三、NOI 模拟十六:yja
题意:有 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)分析:枚举凸包上的点和顺序,然后用拉格朗日乘数法就解决啦。
四、NOI 模拟十六:zkb
(1)区间排序:内部维护线段树,外部用 set 维护所有的树的根节点。
(2)乘积的最高位:考虑 log10 ,然后小数部分;或者 double 直接做,保证始终 < 10 。
五、AGC 024
只做了三道题。。
(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 。
5 月 21 日
一、NOIP 模拟二
围观了一些楼下做的题。
(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 [=_=] 。
四、Pony.ai :AStringGame
题意:给定一个长 1e5 的字符串以及若干个它的子串,Alice 和 Bob 又在玩游戏,Alice 先手,轮流操作,每次可以将一个字串在末尾添加一个字符,使得仍是子串,谁不能操作谁输。
继续练板子,后缀自动机 + SG 函数。
5 月 23 日
一、NOI 模拟十八
今天好像都是傻叉题。。。我交完开头四法,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)$ 的意义吧。
二、beamer 基本用法
\documentclass{beamer}
\usepackage{ctex}
\begin{document}
\title{yww 太强了}
\author{Sdchr}
\maketitle
\begin{frame}{主标题}{副标题}
yww 天下第一
\end{frame}
\begin{frame}[t]{主标题}{副标题}
yww 天下第一
\end{frame}
\end{document}
其余东西遇到现场学。
三、洛谷 5 月月赛:取石子(NIM 游戏,阶梯博弈,SG 函数)
首先是经典的 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$ ,先手有必胜策略。
四、洛谷 5 月月赛:玩游戏(多项式取对数、取指数)
(1)一些知识的回顾
$$\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}$$
(2)一个新的 idea :反向的运用
题意:给定长度为 $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)
$$
(3)小结
对于要计算函数 $f$ 的若干项,可以考虑多项式,从整体上来考虑这个问题,包括了 OGF 和 EGF ,甚至可能对 OGF 或 EGF 进行一个等价的变换,然后计算变换后的东西的多项式,然后再进行逆变换。
对于多项式连乘,可以考虑分治 FFT 。对于多项式连乘,或者多项式连加,如果复杂度爆炸,那么可以考虑计算取对数 / 取指数后的值,然后再进行 exp 或 ln 。
(4)计算 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$$
5 月 25 日
一、NOI 模拟十九:jump
题意:有 $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)$ 了。。。
5 月 29 日
一、NOI 模拟(二十二):游荡计数
如何计算 $A ^ K$ ?求出 $A$ 的特征多项式 $f(A)$ ,然后求出 $A ^ K = A ^ K \mod f(A)$ 。
$A ^ K \mod f(A)$ 考虑利用快速幂,场上不知怎么脑抽了。。
5 月 31 日
最近好颓废啊。。。差不多半个月的超低效率。。。要哭了QAQ。。。
一、Lydsy1805月赛:口算训练
一个重要的条件是 $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]) 个,然后再用个二项堆或者线段树或者平衡树维护一下。
二、Lydsy1805月赛:寻宝游戏
找到并解决了一个类似的问题之后,包括找到了一个相关的定理并考虑完它的证明之后,这时候的思路要非常清晰:有两种想法,一种是利用这个类似的问题的思路,一种是利用这个类似的问题的结论。
我太菜了,这道题直接想怎么 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$$
其实都可以这样处理,就可以避免写求逆元了(虽然求逆元只用一行。。。)。
四、Lydsy1805月赛:对称数(一个数出现次数的奇偶性的相关问题)
“判定是否存在一个数,满足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)$ 。
6 月 1 日
一、Luogu T31154:可爱的随机数
求 $n$ 个点的带标号无向图的连通块个数的期望。
设 $f$ 连通,$g$ 任意,$F, G$ 为指数生成函数,
$$n ! [x ^ n] \sum_{i} \frac{i F ^ i}{i!} = n ! [x ^ n] (F \times G)$$
这道题主要提供的是指数生成函数联系任意与联通的看法,包括第一类 Stirling 列,第二类 Striling 列,Bell 数,以及一系列的连通图计数。