清华集训 2016 选做

清华集训 2016 选做

【清华集训】如何优雅的求和 [* easy]

给定多项式 (f(x)),其次幂为 (m),你需要计算:

[sum_{k=0}^n f(k)inom{n}{k}x^k(1-x)^{n-k} ]

答案对 (998244353) 取模。

(1le nle 10^9,1le mle 2cdot 10^4,0le a_i,x<998244353)

( m Sol:)

将次幂拆开,转为求:

[sum_{k=0}^n k^i inom{n}{k}x^k(1-x)^{n-k} ]

将通常幂转为下降幂通过斯特林数实现:

[egin{aligned} &sum_{k=0}^n sum_{j=0}^i egin{Bmatrix}i\jend{Bmatrix}j!inom{k}{j} inom{n}{k}x^k(1-x)^{n-k} \&=sum_{j=0}^i sum_{k=0}^negin{Bmatrix}i\jend{Bmatrix}n^{underline{j}}inom{n-j}{k-j}x^k(1-x)^{n-k} \&=sum_{j=0}^i egin{Bmatrix}i\jend{Bmatrix}n^{underline{j}}sum_{k=0}^ninom{n-j}{k-j}x^{k-j}(1-x)^{(n-j)-(k-j)} imes x^j \&=sum_{j=0}^i egin{Bmatrix}i\jend{Bmatrix}n^{underline{j}}x^j end{aligned}]

那么我们直接优雅的插值,优雅的递推斯特林数,然后优雅的求和即可。

另一种处理方法是考虑为啥给了点值。

我们考虑多项式 (f(k)) 的牛顿级数。

形如:

[f(k)=sum_{i=0}^m inom{k}{i}f_i ]

我们现在已知点值序列,所以所求的系数序列可以被二项式反演描述:

[f_n=sum_{i=0}^n inom{n}{i}(-1)^{n-i}f(i) ]

所以所求即:

[egin{aligned} &sum_{k=0}^n f(k)inom{n}{k}x^k (1-x)^{n-k} \&=sum_{i=0}^m f_isum_{k=i}^n inom{k}{i}inom{n}{k}x^k (1-x)^{n-k} \&=sum_{i=0}^m f_isum_{k=i}^n inom{n}{i}inom{n-i}{k-i}x^{k-i} imes x^i(1-x)^{n-k} \&=sum_{i=0}^m f_iinom{n}{i}x^i end{aligned}]

于是可以休闲 NTT/brute force 把 (f_i) 求出来,然后直接优雅的计算答案即可。

emmm 2e4 为啥 (m^2) 不能过啊...为啥不开 (1e5),这样我就死心了 TAT

如何优雅的二项式反演:

[f_n=sum_{i=0}^n frac{n!}{i!(n-i)!}(-1)^{n-i}f(i) ]

[frac{f_n}{n!}=sum_{i+j=n} frac{f(i)}{i!} imes frac{(-1)^j}{j!} ]


【清华集训2016】组合数问题 [* hard]

  • Lucas 定理,数位 dp

多组询问,每次给定 (n,m,k),保证 (k) 为质数

求有多少对 ((i,j)) 满足:

[inom{j}{i}mod k=0 ]

( m Sol:)

注意到 (k) 非常小,由 ( m Lucas) 定理,我们知道其等价于:

[inom{j}{i}=inom{j\%k}{i\%k} imes inom{j/k}{i/k} ]

如此往复下去,我们发现一对 (i,j) 满足 (inom{j}{i})(k) 的倍数等价于 (i)(j)(k) 进制下存在至少一位满足 (i> j)

于是我们可以考虑设计一个 (dp) 有统计有多少对 (i,j) 满足 (ile j) 且有 (k) 进制下 (i) 均小于等于 (j) 的方案数。

(f_{i,0/1,0/1,0/1}) 表示当前 (dp) 到第 (i) 位,(n) 上是否受到限制,(m) 上是否受到限制。


【清华集训2016】Alice和Bob又在玩游戏 [* easy]

Alice 和 Bob 又在玩游戏。

(n) 个节点,(m) 条边 ((0≤m≤n−1)),构成若干棵有根树,每棵树的根节点是该连通块内编号最小的点。

Alice 和 Bob 轮流操作(Alice 先手),每回合选择一个没有被删除的节点 (x),将 (x) 及其所有祖先全部删除,不能操作的人输。

需要注意的是,树的形态是在一开始就确定好的,删除节点不会影响剩余节点父亲和儿子的关系。

假设 Alice 和 Bob 都足够聪明,问 Alice 有没有必胜策略。

( m Sol:)

找一种方式来快速计算 sg 值。

考虑一棵子树,将其 sg 值统计在其最上部的节点处,设 (f_u) 表示 (u) 为根子树的 sg 值,设 (g_u) 为除去 (u) 之外的其他子树的 sg 值的异或和,那么容易得到删去节点 (x) 对于答案的影响为:

[igoplus_{xin u.fa} g_xoplus f_x ]

当然如果 (x) 为 root 那么其对答案的贡献则不包含 (f)

如果设 (w_x)(x o root) 的路径上的 (goplus f) 的异或和,那么显然 (sg_{rt})(w_x) 中没有出现过的数。

然而单次转移的时候需要给所有子树异或上 (g_x),然后再求 ( m mex),然后再异或上 (f_x),处理起来显然非常麻烦。

不过我们实际上只需要内部是否满序这个性质,相同权值我们只需要插入一遍,这样就可以查询 ( m mex) 了,集体异或上权值直接打异或标记即可,复杂度 (mathcal O(nlog n)),当然要写一个 01trie 合并。


【清华集训2016】温暖会指引我们前行 [* easy]

给定一张图,每条边有两个属性,温度 ((f)) 与代价 ((w)),定义 (u o v) 的最温暖的路径为一条路径经过若干条边,且其中温度最低的边的温度尽可能大,次低的尽可能大,依次类推(可以认为是字典序比较,但是认为空串的字典序最大)

支持以下三种操作:

  • 加入一条边
  • 修改一条边的代价 (w)(w')
  • 查询 (u o v) 的最温暖的路径的代价权值和。

不允许经过重复路径,对于每组查询输出答案。

( m Sol:)

保证了温度不同,保证了字典序比较,那么我们就只需要维护最大生成树吧。

然后拆边为点,是不是很 easy 呢?


【清华集训2016】汽水

给定一棵大小为 (n) 的树,常数 (k),边有边权,找一条路径,使得这条路径的平均边权尽可能接近 (k),输出差值的绝对值向下取整的结果

(nle 5cdot 10^4,w_i,kle 10^{13})

( m Sol:)

先把边权都减去 (k) 变成使得平均边权最小。

[-mid<frac{w_1+w_2}{x_1+x_2}<mid ]

然后两类讨论,然后莽点分治,写一个 two-point。复杂度为 (mathcal O(nlog^2 nlog w)),然后常数看着不是很大(存疑)?


[清华集训2016]你的生命已如风中残烛 [* hard]

(n) 个特殊牌和 (m-n) 张普通牌,有一个长度为 (m+1) 的序列,最后一个元素固定为 (0),其他元素编号为 (1sim m),每张特殊牌有一个特殊的权值 (w_i) 表示获得了其之后可以摸 (w_i) 张牌,保证 (sum w=m),初始您获得第 (1) 张牌,求所有 (m!) 种方案中使得您摸完牌的方案数。

(m-nge 4,nle 40,w_ile 10^5)

Solution

设初始值为 (1),那么问题等价于对于任意一个位置有前面的数的前缀和 (ge) 其。(所有数均有标号)

即设 (pre_i=sum w_j[jle i]),那么有 (pre_{i-1}ge i)

然后将所有数的 (w) 减去 (1),等价于 (pre_{i-1}ge 1)

我们认为初始值为 (0),问题等价于 (forall i,pre_ige 0)

接下来需要一个引理。

(mathbf{Raney}) 引理

对于整数序列 ({a}),设 (S_i) 表示其前缀和,若 (S_n=1),那么在 (a) 的所有循环移位中,恰好有一个序列 (a') 满足所有前缀和均大于 (0)

  • 可以看具体数学证明。

我们发现计数序列是很难的,我们考虑计算合法的圆排列的数量。

等价于计算所有可能的圆排列的本质不同的断环的方案数。

我们考虑在开头补一个 (+1),那么他就变成了 Raney 引理了。

然而麻烦的是我们无法确定 (+1) 是否一定在开头,所以这个题还是不可做。

那么考虑给原序列补充一个 (-1),然后计算所有前缀和都大于等于 (0),全局和为 (-1) 的圆排列数。

由于最后一个一定是 (-1),这样每个合法的圆排列对答案的贡献都是 (1)

然后类似于 Raney 定理可以说明每种圆排列的轮换只有一个合法。

然后 (m+1) 个数本质不同的圆排列数为 (m!),然后最后一个 (-1) 是任意的,我们要规定他只能是我们加入的 (-1),不难注意到每种 (-1) 结尾的方案并不本质区别,所以直接除以 (m-n+1)

答案就是 (frac{m!}{m-n+1})


【清华集训】石家庄的工人阶级队伍比较坚强 [* easy]

给定 (m),然后令 (n=3^m),给定数组 (f_{0,0},f_{0,1}...f_{0,3^m-1})

给定数组 (b),然后定义卷积:

[f_{k,x}=sum_{y}f_{k-1,y}b_{u,v} ]

其中 (u) 定义为 (W(x,y))(v) 定义为 (L(x,y))

其中 (W(x,y)) 被定义为将三进制的每一位进行比较,出现一组 10/21/02 就累加一次贡献,(L(x,y)) 定义为 (W(y,x))

你需要计算 (f_{t})(t) 给定。

答案对 (p) 取模,保证不存在 (x,y) 满足 (frac{1}{x}+frac{1}{y}=frac{3}{p})

(mle 12,tle 10^9,ple 10^9)

Solution

考虑三进制不退位减法:

[egin{matrix} 0oplus 0=0&0oplus 1=2&0oplus 2=1 \1oplus 1=0&1oplus 2=2&1oplus 0=1 \2oplus 2=0&2oplus 0=2&2oplus 1=1 end{matrix}]

我们发现结果为 (1) 等价于 win,结果为 (2) 等价于 lose

(bit_k(x)) 表示 (x) 中的 (k) 的数量。

那么我们有转移形如:

[f_{k,x}=sum_y f_{k-1,y}b_{bit_1(xoplus y),bit_2(xoplus y)} ]

不难发现贡献实际上只和 (xoplus y) 相关。

(odot) 表示三进制不进位加法,那么不难发现:

[f_{k,x}=sum_{yodot z=x} f_{k-1,y}b_{z} ]

于是相当于计算 3 进制下异或卷积的 (k) 次幂。

我们搞出 FWT 的点值即可处理了。

注意到 (k) 进制 FWT 相当于在做循环卷积,这样我们只需要将给 (k) 进制单位根代入进去即可。

具体式子:

[FWT(i)=sum_{j=0} c(i,j)A_j ]

[FWT(i)=sum_{j=0}^{k-1} c(i_{mathbf{M}},j)sum c(i',j')A_{j'+j imes k^{mathbf{M}}} ]

[FWT(i)=sum_{j=0}^{k-1} omega_{k}^{i_{mathbf{M}}j}sum c(i',j')A_{j'+j imes k^{mathbf{M}}} ]

这样递归即可,由于只需要乘以单项式,所以复杂度是 (mathcal O(k^{m+3})) 的。

由于要次幂一下,会掉精度,所以只能扩域,我们找一个代数单位来表示 (omega_3)

根据单位根的性质,我们注意到 (omega_3^2+omega_3+1=0),这样的话就有 (omega_3^2=-omega_3-1)

这样我们先相当于拿着 (ax^2+bx+c) 类型的多项式在模(?)上做运算,最后我们再把 (a) 表示成 (b,c) 相关消一消。

  • 坑:这个模数保证了 (3) 存在逆元,但是不能直接套质数情况的求法...

然后发现这个题卡这个做法,然后你会发现没必要 FWT 的时候取模,所以可以最后取模。

原文地址:https://www.cnblogs.com/Soulist/p/13779957.html