zoukankan      html  css  js  c++  java
  • 清华集训 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 的时候取模,所以可以最后取模。

  • 相关阅读:
    Java后台校验手机号和邮箱
    centos7安装redis
    centos7安装mysql5.7
    VUE环境运行搭建
    Oracle11gR2安装
    VisualSvn-Server搭建
    SpringCloud-Hoxton.SR1-config整合
    项目简介
    linux常用命令
    JAVA NIO
  • 原文地址:https://www.cnblogs.com/Soulist/p/13779957.html
Copyright © 2011-2022 走看看