标签 巧妙的思路 下的文章

对于两棵树 T_1, T_2,定义它们的交 T_1 \cap T_2 是它们的边集的交形成的森林,k(T_1 \cap T_2)表示这个森林的连通块个数,求下列三种问题之一:

  1. 给定 T_1, T_2,求 y^{k(T_1\cap T_2)}

  2. 给定 T_1,求 \sum_{T_2}y^{k(T_1\cap T_2)}

  3. 给定 n,求 \sum_{T_1}\sum_{T_2}y^{k(T_1\cap T_2)}

其中 n \leq 10^5 ,上面的 sum 是对所有 n^{n-2} 种可能的树求和。答案对 998244353 取模。

orzrqy

READ MORE

先看 n=1 的情况,考虑令 a = w_{1, 1} ,用 f_i 表示跳了 i 步的答案,则 f_i = a^i \binom n i

考虑

\begin{aligned} ans &= \sum_{i \bmod k=m} f_i = \sum_{i \bmod k=m} a^i \binom ni \\ &= \sum_{i=0}^n [k|i-m] a^i \binom ni \\ &= \sum_{i=0}^n \frac 1k \sum_{j=0}^{k-1} \omega_k^{j(i-m)} a^i \binom ni \\ &= \frac 1k \sum_{j=0}^{k-1} \omega^{-mj}_k \sum_{i=0}^n \binom ni (\omega^{j}_k a)^i 1^{n-i} \\ &= \frac 1k \sum_{i=0}^{k-1} \omega^{-mi}_k \left(\omega^i_k a + 1\right)^n \end{aligned}

考虑后面的 \displaystyle{\left(\omega^i_k a + 1\right)^n} 对于固定的 i 是相同的,可以与先处理出 i \in [0, k) 的值,设为 c(i)

前面的部分有个暴力的做法就是多项式多点求值出多项式 \displaystyle{\frac 1k \sum_{i=0}^{k-1} x^i c(i)}\omega_k^0, \omega_k^{-1}, \omega_k^{-2} ... \omega_k^{-k+1} 的值,复杂度 O(k \log^2 k),然而貌似被针对了过不去 ...

考虑一个优秀一点的做法,如何处理 \omega^{-mj}?毛爷爷论文中有个做法是把 ij 拆成 \frac {(i+j)^2} 2 - \frac {i^2} 2 - \frac {j^2} 2 ,然而此题中可能存在单位根没有二次剩余的情况。考虑把 ij 拆成 \binom {i+j} 2 - \binom i2 - \binom j2 ,那么原式可以化为

\begin{aligned} ans &= \frac 1k \sum_{i=0}^{k-1} \omega^{-mi}_k c(i) \\ &= \frac 1k \sum_{i=0}^{k-1} \omega^{\binom {i-m} 2 - \binom i2 - \binom {-m}2} _k c(i) \\ &= \frac {\omega^{- \binom {-m}2}} k \sum_{i=0}^{k-1} \omega^{\binom {i-m} 2}_k \left( \omega^{- \binom i2}_k c(i)\right) \\ \end{aligned}

显然是一个卷积的形式,那么卷积下即可,复杂度 O(k \log k)

考虑 n \le 3 的情况,原来的转移会变成矩阵,感兴趣的读者可以先做下 BZOJ3328 PYXFIB ,与 n = 1 是本质相同的,并且可以发现 c(i) 仍然是一个常数,同理处理下再卷积即可。

READ MORE

考虑一段数 a_{l..r} 是公差为 k 的等差数列,当且仅当:

  • \max a_{l..r} - \min a_{l..r} = k(r - l)

  • \gcd abs(a_i - a_{i-1}) = k, (i \in (l, r])

  • \max pre_{l..r} < lpre_i 表示 a_i 上一次出现的位置。

线段树维护一下即可。

READ MORE

对于每个联通块,可以看做进出了若干次将其走完,显然可以暴力状压预处理出走 ii \in [1, k] )步将该联通块走完的方案数。题意转换为,有 n 个颜色染若干个格子,相邻两个格子不能同色,某种颜色染了的次数唯一对应一个固定权值,一种方案的权值为每种颜色分别染的次数对应的权值的连乘积。这显然可以通过二项式反演来求。

READ MORE

一道挺妙的题,代码难度并不是很大。貌似洛谷春令营讲过这道题然而并没有人去写?(除了 LJC00118 和我 QAQ ...)

我们把区间离线,依次加入序列的每个数并更新以这个数作为右段点的查询的答案。

考虑新加入的数,它能够更新的区间一定满足以下性质。

  • 能够更新的区间不可能超过新加入的数的值上一次出现的位置(如果是第一次加入则为 0 )——再往前排序去重后并不会改变

  • 这个数最多会和值在其 \pm 11 的范围内的数产生贡献——长度超过 10 的极长连续段不需要统计答案。

我们可以把值域在其 \pm 11 范围内的数提取出来,并按照从后往前的顺序重新插入。每次考虑新加入的数对答案产生的贡献(注意是新「加入」而不是新「插入」)。可以发现这是个区间修改状物,可以直接线段树维护,也可以差分到树状数组上。

READ MORE