数数
数数题随机做
[ABC241Ex] Card Deck Score [2881*]
标签:生成函数,tricky problem。
直接写出答案为 \([x^m]\prod\limits_{i = 1}^{n}\dfrac{1 - (a_ix)^{b_i+1}}{1 - a_ix}\)。
由于 \(n \leq 16\),分子可以直接 \(2^n\) 枚举,那么就变成快速求 \([x^r]\prod\limits_{i = 1}^{n}\dfrac{1}{1 - a_ix}\)。
根据有理因式部分分解,可知 \(\prod\limits_{i = 1}^{n}\dfrac{1}{1 - a_ix} = \sum\limits_{i = 1}^{n}\dfrac{c_i}{1 - a_ix}\)。
即 \(1 = \sum\limits_{i}c_i\prod\limits_{j \neq i}(1 - a_jx)\) 。对每个 \(i\) 代入 \(x = a_i^{-1}\) 就可以解出 \(c_i\)。
进而可以 \(O(n\log n)\) 计算 \([x^n]\prod\limits_{i}\dfrac{1}{1 - a_ix}\)。
ABC238Ex Removing People [*3247]
标签:区间 dp,正难则反。
时光倒流,设 \(f_{l,r}, g_{l,r}\) 分别表示 \([l,r]\) 都复活,且 \(l, r\) 是最先复活的的概率和期望。
转移枚举 \(l < k < r\),复活 \(k\) 的方案为 \(cnt = [s_l = R]+[s_r = L]\),权值为 \(coe = [s_l = R](k - l)+[s_r = L](r - k)\)。
于是有 \(f_{l, r} \leftarrow f_{l,r}+cnt \times f_{l, k} \times f_{k,r}\),\(g_{l,r} \leftarrow g_{l,r}+coe \times f_{l,k}\times f_{k,r}+f_{l,k}\times cnt\times g_{k,r}+f_{k,r}\times cnt\times g_{l, k}\)
初始值 \(f_{i, i+1} = 1\),答案是 \((\sum\limits_{i}g_{i,i}) /n!\)
ARC134F Flipping Coins [*3530]
标签:另类容斥,多项式。
这种容斥方法之间做到过,可一结合起来就不会了。。。
连边 \(i \to p_i\) 形成若干个环,只用对环计算答案后 exp 即可。 考虑算环
通过手玩一个环可以发现,一个环最后翻上去的个数等于极长上升子段为长度奇数的个数。 严谨证明不会。
然后就考虑把每个极长连续段的 OGF 写出来,为 \(F(x) = \sum\limits_{i \geq 1}x^iW^{[i \bmod 2 = 1]}\)。
但极长这个限制很棘手,只能通过容斥凑系数的方式解决:即设 \(G(x)\) 满足 \(\dfrac{1}{1 - G(x)} = F(x) \Rightarrow G(x) = 1 - \dfrac{1}{F(x)+1}\)。
然后用 \(\hat{G}\) 来拼接:\(\exp(\sum\limits_{i \geq 1}\dfrac{\hat{G}}{i!}(i - 1)!) = \exp{\ln(\dfrac{1}{1 - \hat{G}(x)})}\) ,所以答案为 \(\dfrac{1}{1 - \hat{G}(x)}\)。
只需要两遍多项式求逆。
ABC236Ex Distinct Multiples [*2898]
标签:另类容斥,子集 dp。
简单的思路是容斥,钦定有 \(k\) 个数相等然后做 dp。不过写出来就会发现这里的容斥系数并不是简单的奇加偶减。
实际上我们应该用边来容斥,设边集 \(E\),其中有边相连的点权值一定相等,无边相连的没有要求,设其对应的方案数为 \(C(E)\),则答案为 \(\sum\limits_{E}(-1)^{|E|}C(E)\)。
因为整个图的容斥系数等于每个连通块的容斥系数,于是可以只考虑每个连通块。
又因为对于一个连通块而言,要求他们相同的方案是一样的,于是变成了如下问题:
将 \(n\) 个点通过边连成一个连通块,一个连边方案的权值为 \((-1)^{|E|}\),求所有连边方案的权值。
直接给出结论:设 \(h_n\) 表示 \(n\) 的答案,则 \(h_n = (-1)^{n - 1}(n- 1)!\)。
证明:所有方案的总和显然为 0,考虑一个不合法方案,1 的连通块大小,若不为 \(n - 1\) 则剩下的连边会奇偶相消,于是枚举孤立点,有:\(h_n = -(n - 1)h_{n - 1} = (-1)^{n - 1}(n - 1)!\)。
然后直接根据这个系数来 dp 即可。时间复杂度 \(O(3^n)\)。
AGC032F One Third [*3975]
标签:积分,转化。
麻了,这种阴间题永远不会。
对于每刀而言,把切的第一刀标记为红色,旋转 \(\dfrac{2\pi}{3}\) 后标记成蓝色,再旋转 \(\dfrac{2\pi}{3}\) 后标记成绿色,那么答案就是异色线段之间的最短距离。
引理 1:在 \([0, 1)\) 之间随机选择 \(n - 1\) 个点分割成的 \(n\) 条线段当中,第 \(k\) 小的期望为 \(\dfrac{1}n(\sum\limits_{i = 1}^{k}\dfrac{1}{n - i+1})\)。
证明:当 \(k = 1\) 时,即是最短线段的期望,计算所有线段 \(\geq x\) 的概率,积分可得:
当 \(k > 1\) 时,采用归纳法证明即可。
只考虑 \([0, \dfrac{2\pi}3)\) 这一部分的贡献,因为剩下两部分是对称的。
由于异色线段最小值只有可能在相邻两个点之间取得,枚举异色线段为第 \(k\) 小,这要求前 \(k - 1\) 小的线段都是同色的,概率就是 \(\dfrac{3^{n - i+1} - 3^{n -i}[i \neq n]}{3^{n}} = 3^{-i +1} - 3^{-i}[i \neq n]\),因为 \(n\) 个线段不可能全部同色,于是答案就是:
\(ans = \dfrac{1}{3n}\sum\limits_{i = 1}^{n} (3^{-i+1} - 3^{-i})\sum\limits_{j = 1}^{i}\dfrac{1}{n - j+1} = \dfrac{1}{n}\sum\limits_{j = 1}^{n}\dfrac{1}{n - j+1}3^{-j}\)
时间复杂度 \(O(n)\)。
ABC225H Social Distance 2 [*3061]
标签:生成函数,组合数学。
还算简单。
只用考虑三种情况的生成函数:
- 两端都有人时:为 \([x^{n+1}]\dfrac{x^m}{(1 - x)^{2m}} = \dbinom{n+m}{2m - 1}\)
- 一端有人时:\([x^n]\dfrac{x^m}{(1-x)^{2m+1}} = \dbinom{n+m}{2m}\)
- 两端都没人:\([x^n]\dfrac{x}{1 - x} \times \dfrac{x^{m - 1}}{(1 - x)^{2m - 2}}\times \dfrac{1}{1 - x} = \dbinom{n+m - 1}{2m - 1}\)
把每一段的分治卷起来,over。
时间复杂度 \(O(n\log^2 n)\)。
ARC132F]Takahashi The Strongest [*3076]
标签:FWT,构造。
由于 \(P\) 能战胜 \(R\),\(R\) 能战胜 \(S\),\(S\) 能战胜 \(P\),把 \(R\) 看作 1, \(S\) 看作 2,\(P\) 看作 3,将一个操作序列看作 4 进制下长度为 \(k\),的数,然后考虑如下的运算:
\(x \otimes y = \begin{cases} 0 \ \ \ x \neq y \\ x \ \ \ x = y\end{cases}\)
那么一个操作序列 \(S\) 的答案就是 \(A,B\) 做卷积后,至少有一位与 \(S\) 相同的个数,代表着存在一轮,\(A,B\) 出的都相同,而 \(C\) 恰好出了能获胜的哪一个。
根据 FWT 相关理论,可以构造出真值表为:
\(\begin{bmatrix} 1 \ \ 1 \ \ 1 \ \ 1 \\ 0 \ \ 1 \ \ 0 \ \ 0 \\ 0 \ \ 0 \ \ 1 \ \ 0\\ 0 \ \ 0 \ \ 0 \ \ 1\end{bmatrix}\),(其实就是把 0 看作 1, 2, 3 的子集,其中 1 2 3互不包含时的高位后缀和),显然其逆矩阵为:\(\begin{bmatrix} 1 ,-1,-1 , -1 \\ 0 \ \ \ \ 1 \ \ \ \ 0 \ \ \ \ 0 \\ 0 \ \ \ \ 0 \ \ \ \ 1 \ \ \ \ 0\\ 0 \ \ \ \ 0 \ \ \ \ 0 \ \ \ \ 1\end{bmatrix}\)
然后考虑求至少有一位与 \(S\) 相同的的方案,容易转化为计算每一位都与 \(S\) 不同的方案,显然也可以 FWT 计算。
[ARC132E] Paw [*3144]
标签:结论,期望。
首先应该观察最终形态,最终状态一定形如 [<<<****>>>] 的形式,其中 * 是相邻两个 . 之间的 <>。
于是考虑枚举相邻的两个 ..,在中间的可以前缀和算出来,对于左右两边的方案,是对称的,不妨算左边。
设含有 \(n\) 个 .,且最后的状态为 <<< 的概率为 \(f_n\)。
考虑所有 \(2n\) 中情况,只有把最靠右的一个往右移是非法的,其他的均能转化成 \(n - 1\) 的情况,故 \(f_n = \dfrac{2n - 1}{2n}f_{n - 1}\)。
时间复杂度 \(O(n)\)。
P6633 [ZJOI2020] 抽卡
标签:多元拉格朗日反演,牛顿迭代。
先转为计算抽了 \(n\) 次都没有抽到连续 \(k\) 张卡的概率,再转化为计算从抽到 \(x\) 张到抽到 \(x+1\) 张不同的期望轮数。
设 \(f_n\) 表示抽出 \(n\) 张不同的卡且没有连续 \(k\) 张的方案,答案就是 \(\sum\limits_{i}\dfrac{f_i}{\binom n i}\times \dfrac{n}{n - i}\)。
显然每个连续段是独立的,只用对单个连续段算出后分治乘起来即可。
对于一个长度为 \(n\) 的连续段而言,不超过 \(k\) 的生成函数为 \(F(x) = \dfrac{x - x^{k+1}}{1 - x}\) ,那么 \(f_{n+1 - i} = [x^{n+1}y^i] \dfrac{1}{1 - yF(x)}\)。
设 \(H(x) = \dfrac{1}{1 - yx}\),\(G(x) = F^{(-1)}(x)\)
回忆扩展拉格朗日反演:\([x^n]H(F(x)) = [x^n]H(x)(\dfrac{x}{G(x)})^{n+1}G'(x)\)
二元生成函数也可以进行拉格朗日反演:\([x^{n+1}]H(F(x)) = [x^{n+1}]H(x)(\dfrac{x}{G(x)})^{n+2}G'(x) = [x^{n+1}]\dfrac{1}{1 - yx}(\dfrac{x}{G(x)})^{n+2}G(x)'\)
于是只用把后面两个算出来后,\(x\) 的第 \(t\) 项就对应 \(y\) 的 \(n+1 - t\) 项。
至于怎么求出 \(G(x)\),显然可以牛顿迭代。柿子:
\(F(x) = F_0(x) -\dfrac{(1 - x)F - F^{k+1} - x}{1 - x - (k+1)F^k}\)。
时间复杂度 \(O(n \log^2 n)\),常数应该非常大。
[ARC133F] Random Transition [?]
标签:生成函数,多项式变换。
对于题目的概率分布,可以看作 \(n\) 个 01 硬币,初始 \(i\) 个向上,每次操作等概率选择一个硬币翻转,求最后恰好有 \(p\) 个向上的概率。
设 \(G_i(x)\) 表示初始为 \(i\) 时经过 \(K\) 次得到的生成函数,对于每个硬币,根据其初始是 0 还是 1 列出表达式:\(G_i(x) = [\dfrac{x^K}{K!}](\dfrac{e^x + e^{-x}}2{ \times y+\dfrac{e^x -e^{-x}}2})^{i}(\dfrac{e^{x} - e^{-x}}{2} \times y +\dfrac{e^x +e^{-x}}{2})^{n - i}\)
设 \(P(x) = e^x(y+1), Q(x) = e^{-x}(y - 1)\),则: \(G_i(x) = [\dfrac{x^K}{K!}]2^{-n}(P+Q)^i(P - Q)^{n - i}\)
对所有 \(G_i\) 求和 \(= 2^{-n}n^{-K}10^{-9}\sum\limits_{i =0}^{n}[\dfrac{x^K}{K!}]P^iQ^{n - i}[z^i]\sum\limits_{j = 0}^{n}a_j(z+1)^{j}(z - 1)^{n - j}\)。
而对于每个 \(i\) 求出 \(g_i = \sum\limits_{j}^{n}[z^i]a_j(z+1)^j(z - 1)^{n - j}\) 是可以 ntt 算的,具体怎么算放在后面。
$ = [\dfrac{xK}{K!}]2n{-K}10\sum\limits_{i = 0}{n}(y+1)i(y - 1)^{n - i}e^{(2i - n)x}g_i = 2{-n}n10^{-9}\sum\limits_{i = 0}^{n}(2i - n)Kg_i(y+1)i(y - 1)^{n - i}$。
不 觉 得 很 类 似 吗。
于是还能 ntt 计算 \(g_i(y + 1)^i(y-1)^{n - i}\) 部分。
计算 \(\sum\limits_{i = 0}^{n}g_i(y+1)^i(y - 1)^{n - i}\)
\(=\sum\limits_{i = 0}^{n}g_i(y - 1+2)^i(y - 1)^{n - i} = \sum\limits_{i = 0}^{n}g_i\sum\limits_{j = 0}^{i}\dbinom i j2^{j}(y -1)^{n - j} =\sum\limits_{j = 0}^{n}(y - 1)^{n - j}\sum\limits_{i \geq j}g_i\dbinom i j\)
算出 \(f_j = \sum\limits_{i \geq j}g_i\dbinom i j\) 后,再把 \((y - 1)^{n - j}\) 二项式定理展开即可,略去不谈。
时间复杂度 \(O(n \log n)\)。
[ARC136F] Flip Cells [*3554]
标签:概率生成函数。
其实这个题和上个题几乎没有任何区别的说。。
考虑经典的算两次模型,设 \(F(x)\) 表示答案的生成函数,\(G(x)\) 表示钦定到达终止态的生成函数,\(H(x)\) 表示从终止态到终止态的生成函数。
显然有 \(G = FH\),于是 \(F = \dfrac G H,F'(1) = \dfrac{G'(1)H(1) - G(1)H'(1)}{H^2(1)}\)。
\(H(1), H'(1)\) 和 \(G\) 计算方式是一样的,只用把初始 \(a_i\) 赋为 \(b_i\) 即可,现在只用考虑 \(G\)。
若最后要求 \(i\) 个与初始相反,\(nm-i\) 个相同,那么贡献就是 \((\dfrac{e^x-e^{-x}}2)^i(\dfrac{e^x+e^{-x}}2)^{nm - i}\),于是我们只关心有多少个格子是与初始不相同的。
由于 \(n,m\) 很小,直接设 \(dp_{i,j}\) 表示考虑前 \(i\) 行,选了 \(j\) 个的方案即可。这一步部分时间复杂度 \(O(n^2m^2)\)。
于是 \(=\sum\limits_{i=0}^{nm}dp_{n,i}(\dfrac{e^x - e^{-x}}2)^i(\dfrac{e^x+e^{-x}}2)^{nm - i}\),根据上一题的套路拆成 \((z +1)^i(z - 1)^{n - i}\) 后计算,变成形如 \(\sum\limits_{i = -nm}^{nm}c_ie^{ix}\) 的形式,写成普通生成函数 \(\sum\limits_{i = -nm}^{nm}c_i\dfrac{1}{1 - \frac{ix}{nm}}\),这样求导只用每个加起来就好。
但是当 \(i = nm\) 时,\(\dfrac{1}{1 - x}\) 没有意义,实际上确实也如此:钦定到达终止态的方案本来就是无穷的。为了使它有意义,分子分母同时乘上 \((1 - x)\),改写成 \(F = \dfrac{G(1 - x)}{H(1 - x)}\)。这样的话 \(G(1) = c_{nm},G'(1) = \sum\limits_{i = -nm}^{nm - 1}c_i\dfrac{i/nm - 1}{(1 - (i/nm))^2}\)。
时间复杂度 \(O(n^2m^2)\)。
P7468 [NOI Online 2021 提高组] 愤怒的小 N
标签:拉格朗日插值,打表。
先找数列通项。发现,后 \(2^{n - 1}\) 的数是由前 \(2^{n - 1}\) 的数在最高位加入 1 得到,而符号取反,于是就有 \(f(i) = \mathrm{popcount}(i) \bmod 2\),即 \(f(i) = \dfrac{1 - (-1)^{\mathrm{popcount}(i)}}{2}\)。
于是没有 ppc 的部分直接拉格朗日插出 \([0, n - 1]\) 的多项式前缀和即可,\(O(k^2)\)。
考虑后半部分,考虑枚举 \(n\) 的高位,设 \(f(x, c, k) = \sum\limits_{i = x}^{x+2^c - 1}(-1)^{\mathrm{popcount}(i)}i^k\),而 \(x\) 的最低位大于 \(c\),于是就有 \(f(x, c, k) = (-1)^{\mathrm{popcount}(x)}\sum\limits_{i = 0}^{2^c - 1}(-1)^{\mathrm{popcount(i)}})(i+x)^k = \sum\limits_{i = 0}^{2^c - 1}(-1)^{\mathrm{popcount(i)}}\sum\limits_{j = 0}^{k}\dbinom k jx^{k - j}i^j = (-1)^{\mathrm{popcount(x)}}\sum\limits_{j = 0}^{k}\dbinom{k}jx^{k - j}f(0, c, k)\)
只需要计算出 \(f(0,c,k)\) 即可。而 \(f(0, c, k)\) 也可以类似的方法做到 \(O(nk^2)\)。
然后通过打表发现 \(c > k\) 时 \(f(0, c, k) = 0\),于是需要计算的 \(f(0, c, k)\) 只有 \(O(k^3)\) 级别,容易记忆化搜索实现。
P8354 [SDOI/SXOI2022] 多边形
标签:容斥,多项式。
若 \(a_i = 1\) 显然是卡特兰数 \(Cat(n - 1)\),对于边上有点的情况,可以看作如下限制:
- 边上的点可以不连边。
- 不能在同一条边上连跨越一个点的边。
直接枚举有边连的点,设为 \(cnt\),则在 \(Cat(cnt - 1)\) 的所有不合法方案中一定存在边,使得其恰好跨过了一个被选择的点。
于是考虑对上面的非法情况容斥,先选择一个有边相连的集合 \(S\),再在集合内部钦定 \(k\) 对点被跨过,这 \(k\) 个点两两不相邻,把这些边缩起来。显然对于每条边都是独立的,只用把所有边的容斥系数 \(F_{a_i}\) 求出后全部卷起来后乘上卡特兰数即可。
而在大小为 \(t\) (不包含端点)的全集中选出 \(i\) 个点拼起来的方案为:\(f_i = \sum\limits_{j= 0}^{t - i}(-1)^j\dbinom{t}{i+j}\dbinom{i+1}j\)。
考虑如何在 \(O(\sum a_i)\) 的复杂度内求出这个东西,先做一些简单的变化:
\(f_i = [x^{t - i}]\sum\limits_{j = 0}^{t - i}(-x)^{j}\dbinom{i+1}{j}x^{t - i - j}\dbinom{t}{i+j} = [x^{t - i}](1 - x)^{i+1}(1+x)^t\)。
设 \(F_k = (1-x)^{k+1}(1+x)^t\)。然后考虑求导递推:\(F'_k = F_k\times (\dfrac{t}{1 - x} - \dfrac{k+1}{1+x})\),最后得到:\((n+1)g_{n+1} = (t - k - 1)g_n - (t+k - n +2)g_{n - 1}\)(\(< 0\) 的项定义为 0)
于是对于单个 \(f_i\) 可以递推求解,只需要保留最后两项然后根据递推式从后往前推。
考虑到 \(F_{k+1} = F_k(1 - x)\),因此 \(f_{k+1}\) 的项可以由当前保存的 \(w_{k+1}, w_{k+2}\) 得来。于是需要保存相邻的 3 个值,可以做到 \(O(\sum a)\) 计算。
[AGC021F] Trinity
标签:dp,思维。
设 \(dp_{n, m}\) 表示 \(n\) 行 \(m\) 列的矩形,其每一行都至少有一个为黑色的方案,那么答案就是 \(\sum\limits_{I = 1}^{n}\dbinom n i dp_{i, m}\)。
考虑求解 \(dp_{n,m}\),枚举 \(m - 1\) 列中至少有一个为黑色的行数 \(k\)。若 \(k = n\) 显然有 \(1 + n+\dbinom n 2\) 种方式;否则至少有一行需要在第 \(m\) 列填上黑色。
考虑一个长度为 \(k+2\) 的集合和原方案的双射:设原来强制染色行为 \(a_1, a_2, \dots, a_k\),在最前面加入最小染色行 - 1 的数,最后面加入最大染色行 + 1 的数构成的集合。方案树就是 \(\dbinom{n+2}{k+2}\),于是最后的转移就是:
\(dp_{n, m} \leftarrow dp_{n,m}+dp_{n,m - 1} \times (1+n + \dbinom n 2)+\sum\limits_{k < n}dp_{k, m - 1} \times \dbinom{n+2}{n-k+2}\)
直接转移是 $O(n^2m) $ 的,但发现第二种转移可以用 NTT 优化,时间复杂度就是 \(O(nm\log n)\) 。
[ABC231G] Balls in Boxes [*2606]
标签:大套路题。
答案是 \([\dfrac{x^k}{k!}]\prod\limits_{i = 1}^{n}(a_i+x)e^x = [\dfrac {x^k}{k!}]e^{nx}\prod\limits_{i}(a_i+x)\)
于是 \(O(n^2)\) 背包后直接算即可。
[ABC242Ex] Random Painting [*2835]
标签:小套路题。
min-max 容斥一下,设 \(dp_{n,i,j}\) 表示考虑到前 \(n\) 个位置,目前已选集合与 \(\{a_i\}\) 交大小为 \(i\) ,之前选的最靠右的为 \(j\) 的总容斥系数,显然可以二维前缀和后 \(O(n^2m)\) 算。答案就是 \(\sum\limits_{i,j}\dfrac m i dp_{n, i, j}\)
[ARC124F] Chance Meeting [*3246]
标签:容斥,格路计数。
两个东西相遇当且仅当 \(x, y\) 都相等,即走过 \(x\) 总和为 \(n\) 时,走过的 \(y\) 之差为 0 的次数恰好一次。于是先将答案乘上 \(\dbinom {2n}n\) 转化为如下问题:
初始在 \((0, 0)\),往上走 \(2n\) 步,往左,右各走 \(m\) 步,求恰好经过 \((0, n)\) 1 次的方案数。
设 \(f_i\) 表示从 \((0, 0)\) 刚好走到 $(0, n) $ ,且往左往右走了 \(i\) 次的方案数,答案就是 \(\sum\limits_i f_if_{m - i}\)。
设 \(g_i\) 表示钦定走到 \((0, n)\),往左往右走了 \(i\) 次的方案,则 \(g_i = \dbinom{n+2i}{n, i, i}\)
考虑 \(g\) 和 \(f\) 的关系,容易发现,\(g\) 是从 \(f\) 第一次走到 \((0, n)\) 后,再反复横跳若干步得到。设 \(h_i = \dbinom{2i}i\),则 \(G = FH\)。
又 \(H = \dfrac{1}{\sqrt{1 - 4x}}\),于是 \(F^2 = \dfrac{G^2}{H^2} = G^2(1 - 4x)\)。
时间复杂度 \(O(n)\)。
[ABC245Ex] Product Modulo 2 [*3057]
先 CRT 拆成若干个 \(\prod a_i \equiv n (\bmod p^c)\) 的形式,对每个素数幂答案相乘即可。
设 \(n =xp^d(p\nmid x) \neq 0\),先在 \(k\) 个数中选出 \(d\) 个,方案为 \(\dbinom{k+d-1}{d}\),设 \(i\) 的次数为 \(u_i\),则 \(i\) 可以填剩下的方案为 \(p^{c - u_i - 1}(p - 1)\),由于 \(p \nmid x\),\(x\) 必然有逆元,让前面 \(k - 1\) 个数随便选后最后一个数可以唯一确定,即对于每个 \((p, x) = 1\),\(x\) 的出现次数都是相同的,这样的 \(x\) 有 \(p^{c - d - 1}(p - 1)\) 个,于是立马写出总方案:
当 \(n = 0\) 时考虑容斥,答案为 \(p^{ck} - \sum\limits_{i = 0}^{c - 1}\dbinom{k+i - 1}i(p - 1)^kp^{ck - i - k}\) 。
时间复杂度 \(\mathcal O(\sqrt n)\)。
[ARC128F] Game against Robot [*3671]
对于一个固定的 \(p_i\),把所有元素按照 \(p_i\) 从大到小排成一列,则 bot 都会把当前剩余最大的吃掉,注意到最终能得到的集合和权值无关,因此先来研究一下什么样的集合可以得到。
设 \(N = 2n\),容易发现,在开头补一个 -1 后,把选的看做 1,不选看做 -1,则等价于所有前缀和 \(\leq 0\)。或者说,设选择了 \(b_1, b_2, \dots, b_{n}\),显然存在一种最优方案是按照对应顺序选的,则需满足 \(b_i \geq 2i - 1\)。
可以想到如下贪心:从 \(n\) 到 1 枚举所有元素,每次加入 \(2i - 1\) 和 \(2i\) 进大根堆,每次弹出最大元素并累加答案,正确性显然。
考虑如何计数这个过程:枚举 \(x\),把 \(\geq x\) 的 \(a_i\) 看做 1,否则为 0,则可以只考虑大根堆中只有 01 的情况。设 \(s_i\) 表示经过 \(i\) 次后堆的大小,\(e_i\) 表示第 \(i\) 次加入 1 的个数,则每次 \(s_i \leftarrow \max(0, s_i +e_i - 1)\)。
转化到平面上,就是每次从 \((x, y) \to (x+1, y+1 / y /y - 1)\),方案分别为 \((1, 2, 1)\),如果 \(y<0\) 强制 \(y = 0\),然而,这个东西并不容易计数。
如果当 \(y<0\) 就不管,设 \(m\) 表示 1 的总个数,则最后会走到 \((n, m - n)\),如何得到被浪费的个数呢?我们可以把每次走到一个前缀最小值看做一个新的起点,如果后面没有低于这个前缀最小值就表示没有浪费,又因为前缀最小值是连续变化的,因此序列的前缀最小值就是被浪费的个数!
设最终的前缀 min 为 \(-s\),考虑先算出 \(\leq -s\) 的方案相减。
引理:从 \((0, 0)\) 走到 \((n, m)\),每次↗/ → / ↘方案为 \((1, 2, 1)\) 的方案为:\(\dbinom{2n}{n+m}\)
Proof:即 \([x^m](x+2+x^{-1})^n = [x^{m+n}](x^2+2x+1)^n = [x^{m+n}](x+1)^{2n}\)
根据经典卡特兰容斥,经过 \(-s\) 的方案为:\(\dbinom{2n}{m+2s}\) 。
于是总答案为:\(n \dbinom{2n}m - \sum\limits_{s \geq 1}\dbinom{2n}{m+2s}\)。右边可以对奇偶分别预处理。
时间复杂度 \(\mathcal O(n)\)。
[ARC139D] Priority Queue 2 [*2816]
枚举 \(c\),还是计算 \(\geq c\) 的方案。若 queue 中有 \(\geq n - x +2\) 个 1 则会删去一个。
设初始有 \(A\) 个 1,\(k\) 步加入了 \(B\) 个 1。
当 \(A \leq n - x +1\) 时,显然每次 1 的个数都不会超过 \(n - x+1\),于是最后有 \(\min(n - x+1, A+B)\) 个 1。
当 \(A>n - x+1\) 时,显然每次都至少有 \(n - x+1\) 个 1,当 \(A - (n - x+1)+B > k\) 时也只能删 \(k\) 个,于是最后剩下 \(\max(n - x+1,A+B - k)\) 个 1。
直接组合数计算,时间复杂度 \(\mathcal O((n+k)m)\)。
[ABC249Ex] Dye Color [*3487]
科技题目。需要用到鞅的停时定理。
说白了,就是给每个状态赋一个势能函数 \(\varphi(S)\),对于一个 \(S\) 到达的状态都满足 \(\sum p(S|T)\varphi(T) = \varphi(S)+1\),于是只需要算出初始态和终止态的 \(\varphi\) 相减就可以得到期望。
设一个状态 \(S\),颜色为 \(i\) 的个数为 \(a_i\),设 \(\varphi(S) =\sum\limits_{i = 1}^{n}\varphi(a_i)\)。对每个颜色分开考虑,\(a_i\) 可以转移到 \([0, a_i+1]\),分类讨论:
- 转移到 \(a_i+1\) 时,要么包含 \(a_i\) 中恰好一个且赋值颜色为 \(i\),或者不包含任何一个 \(a_i\) 且有赋值 \(i\),方案为 \(a_i\sum\limits_{i = 0}^{n - a_i}\dbinom{n - a_i}i(n - 1)^{\underline i}+\sum\limits_{i = 1}^{n - a_i}\dbinom{n - a_i}{i} (n - 1)^{\underline{ (i - 1)}}i\)。
- 转移到 \(a_i - x\) 时:再分类讨论选出的颜色是否有 \(i\),同理计算即可。
根据 \(\sum\limits_{i = 1}^{n}\varphi(a_i)+1=\sum\limits_{i = 1}^{n}\sum\limits_{j = 0}^{a_i+1}p_{a_i, j}\varphi(j)\),其中 \(p_{i, j}\) 是初始 \(i\) 个变成 \(j\) 个的概率,不妨令所有颜色 $ \sum\limits_{j = 0}^{a_i+1}p_{a_i, j}\varphi(j) = \varphi(a_i)+\dfrac 1 n$。这样的话可以得到一个 \(n\) 元线性方程组。
不需要高斯消元,因为已经是一个上三角矩阵,直接令 \(\varphi(0) = 0\) 从上往下递推即可。
时间复杂度 \(\mathcal O(n^2)\)。 为什么直接把 \(\varphi(0) = 0\) 还有待商榷。
[ARC140F] ABS Permutation (Count ver.) [*3392]
太套路了,考虑 \(P_{i}\) 的逆排列 \(Q_i\),若 \(|P_i - P_{i+1}| = M\),则 \(|Q_{i+M} - Q_i| = 1\),把下标按照 \(\bmod M\) 分组,每组显然是独立的,于是问题变成了 CF1553I Stairs。
时间复杂度 \(\mathcal O(n\log^2 n)\)。
[ABC257Ex] Dice Sum 2 [*3461]
[AGC024E] Sequence Growing Hard [*3001]
[ABC260Ex] Colorfulness [*3339]
[AGC002F] Leftmost Ball [*3399]
[ARC145F] Modulo Sum of Increasing Sequences [*3943]
[ARC137F] Overlaps [*3313]
CF1605F PalindORme
CF1086F Forest Fires
CF1608F MEX counting
[CTS2019] 氪金手游
对于题目所给条件:$\forall S,s.t.∅ \subset S \subset {1, 2, \dots, N} $ ,$\exist (u, v) \in E,s.t. \ u\in S, v \notin S \or u \notin S, v \in S $,本质上就是一个弱连通树(将所有有向边改为无向边后是一棵树)。
当树是一棵外向树时,假设所有 \(W_i\) 已知,概率类似于拓扑排序方案,设 \(sum\) 为 \(x\) 子树内 \(W_i\) 之和,则 \(dp_x = \prod\limits_{y \in son_x} dp_y \times \dfrac{W_x}{sum}\)。
设 \(dp_{x, i}\) 表示 \(x\) 子树内,\(sum = i\) 的总概率,可以 \(O(n^2)\) 求解。
当树不是一棵外向树,即出现向内指的边,可以考虑容斥。即钦定一些反向边变为正向边,其他反向边任意选择(等价于断开后每个连通块答案),乘上 \((-1)^k\) 贡献。
注意到本题答案是许多元素的乘积,且正向边永远会计入答案,因此可以直接把容斥系数 \((-1)\) 放进 DP 里面。在处理一条反向边时,若钦定变为正向,\(dp_{x, i+j} \leftarrow dp_{x, i} \times dp_{y, j} \times(-1)\),否则若不钦定,等价于断开,直接 \(dp_{x, i} \leftarrow dp_{x, i} \times dp_{y, j}\)。
时间复杂度 \(O(n^2)\)。
CF1792F2 Graph Coloring (hard version)
本质上是 [THUPC2018]好图计数 有标号版本。
将红色看作有边,蓝色看作没边,问题相当于 \(n\) 个点的有标号图,对于任意一个子集,这个子集的图和子集补图不能同时连通。
考虑一个好图是怎么得来的,首先若只有一个连通块不太好办,注意到 \(n \geq 2\) 时好图与补图不能同时连通,于是只用考虑连通块 \(\geq 2\) 的情况,设 \(f_n\) 表示 \(n\) 个点的的答案。最后答案是 \(2f_n - 2\)。
注意到若选择的点集不在同一个连通块一定满足条件,总存在一个点连向所有边,因此一个图是好的当且仅当连通块 \(\geq 2\),且所有连通块是好的(\(n = 1\) 特殊处理)。
直接写出等式 \(F = e^F - F +x - 1\),可以牛迭。也可以改写成 \(x = F - e^F +1\) 进行拉格朗日反演。
时间复杂度 \(O(n\log^2 n)\) 或 \(O(n \log n)\)。
P5369 [PKUSC2018]最大前缀和
\([1, p]\) 是最大前缀和当且仅当:
- 从 \(p+1\) 开始的所有前缀和 \(<0\)。
- 对于所有 \(i \in [2, p]\),\(s[i, p] \geq 0\)。
对于两部分分开计算,对于前者,设 \(f_S\) 表示加入 \(S\) 后所有前缀和 \(<0\) 的方案。对于后者,设 \(g_S\) 表示加入 \(S\) 后所有后缀和 \(\geq 0\) 的方案,枚举最后一个数计算答案。
时间复杂度 \(O(n2^{n - 1})\)