闲话 23.3.16

闲话

打题!别过你那少爷生活

好 今天又没有想说的了
但是我没学过载谭 Binomial Sums!

今日推歌:关山酒(covered by 兰音 Reine)

杂题

我也想摆啊,但是真不能一直摆啊。

CF1034E

给定长为 2n 的序列 ai,bi,请计算 ci=j|k=i,j&k=0aj×bk(mod4)

n21

这是子集卷积的形式没错,但是 O(2nn2) 的复杂度不支持 n=21

mod 4 启发我们构造一种新的形式。考虑 k>0, 4k0(mod4),我们不妨采用 4k 来分离贡献。
假设 f(v) 表示 v 的二进制表示中 1 的个数。这样我们可以发现,4f(k) 对第 k 位的值正是一个可以分离贡献的系数,我们可以通过这个系数删除 j&k=0 的限制。
证明考虑对 j&k=04f(i)+f(j)f(i|j)=1,而其余情况都是 4 的倍数。
因此我们只需要构造 ai=ai×4f(i),则 c 序列就是 ab 的或卷积。先乘入 4f(i) 后做或卷积,再除掉即可。

总时间复杂度 O(2nn)

Submission.



CF1305F

给定 n 个数,每次可以选择将一个数 +11,求至少多少次操作使得整个序列都是正数且全部元素的 gcd>1

n2×105,ai1012

这题给我整不会了。

首先一定有一个构造是操作次数 n 的。我们只需要将所有奇数 +1,这样总会有 2 作为 gcd
然后我们可以知道对最优方案,一定有至少一半的元素被至多操作了一次。这点可以通过反证法根据如上构造的存在性证明。

然后我们就有一种随机化方法了。我们随便找一个数,考虑它在最终方案中被 +1/±0/1 的情况。这个数最终的得数是知道的,且最终的 gcd 一定是这个数其中一个质因子的倍数。因此可以枚举这个数的质因子,对其他所有数求最小步数使得它成为当前枚举到的质因子的倍数。加和取最小值即可。
这样的错误率是 1/2,我们只需要随机 30 次就可以将错误率减到 1010 量级。

假设值域为 V,随机了 k 次,并使用的分解算法单次复杂度是 f(V),总时间复杂度为 O(kf(V)+nlogV)

Submission.



CF1153F

有一段长为 l 的线段,有 n 个区间,左右端点在 [0,l) 间均匀随机(可能不是整数)

求期望被至少 k 段区间覆盖的长度,对 109+7 取模。

1n,k107,1l109

这里不支持辩论。

首先可以考虑 l=1 的情况,答案乘入 l 即为最终答案。
也可以发现,这时的期望就是概率,因此可以通过算概率来计算答案。

考虑任意点 x[0,1),它被覆盖一次的概率是 2x(1x),也就是左边长度乘右边长度乘二,因此可以枚举一个点被实际覆盖的次数 i,作选择就能得到某个点被至少 k 段区间覆盖的概率

P(x)=i=kn(ni)(2x(1x))i(12x(1x))ni

答案即为

01i=kn(ni)(2x(1x))i(12x(1x))nidx= 01i=knj=0ni(1)j(ni)(nij)(2x(1x))i+jdx= i=knj=0ni(1)j(ni)(nij)2i+j01xi+j(1x)i+jdx= i=knj=0ni(1)jn!i!j!(nij)!2i+j(i+j)!2(2i+2j+1)!(Beta )= i=knj=0ik(1)jn!(ij)!j!(ni)!2ii!2(2i+1)!= i=knn!(ni)!2ii!2(2i+1)!j=0ik(1)j1j!(ij)!= i=kn(ni)2ii!2(2i+1)!j=0ik(1)j(ij)= i=kn(ni)2ii!2(2i+1)!(j=0ik(1)j((i1j)(i1j1)))= i=kn(ni)2ii!2(2i+1)!(j=0ik(1)j(i1j)j=0ik1(1)j(i1j))= i=kn(ni)2ii!2(2i+1)!(1)ik(i1ik)= i=kn(1)ik(ni)(i1ik)2ii!2(2i+1)!

这样我们可以在 O(n) 的复杂度内得到答案。

Submission.

Bonus: 你能否找到最终答案的 ode 形式?



SP11414

Alice 和 Bob 在一棵 n 个节点的树上玩游戏,Alice 先手。

每个节点最初都是黑色或白色。他们轮流执行以下操作:从当前树中选择一个白色节点 v,将路径 (1,v) 上的所有白色节点都变为黑色。最后操作的玩家获胜。当他们都使用最佳策略时,求先手是否必胜,并求出第一步可以选择的点。

1n105

考虑用 SG 函数来刻画这个性质。

我们令 sg(u) 表示 u 及其子树组成的树的 SG 函数值,然后考虑从什么地方转移。

如果 u 子树内全是黑点,则 sg(u)=0,这显然。反之考虑一个子树内的白点 v,我们需要考虑选择 v 对答案的贡献。
选择 v 会删除 uv 路径上的所有点,将原树分裂成一棵森林。假设新森林的根集合是 S,让这状态的 SG 函数 sg(S)=vSsg(v)。同样有 sg(u)=mexS(sg(S))。这样直接做的复杂度是 O(n3) 的。

考虑优化。
我们对每个点维护一个集合 S(u),表示其子树内能通过删路径得到的森林的 SG 函数的全体。
考虑 S(u) 内的元素可以如何转移过来。对于 u 的儿子 v,考虑 sS(v),发现它对应的森林中增加的树即为 u 的非 v 儿子的子树,因此我们直接将 s 异或上这些子树的 SG 函数值后放入 S(u) 即可。还有一种是自己是白点,直接把儿子的 SG 函数异或起来就行了。这样直接做的复杂度是 O(n2) 的。

考虑操作。
我们的操作是:将集合内所有值异或一个数;将两个集合合并;求一个集合的 mex
这可以用 01Trie 维护,得到 O(nlogn) 的复杂度。

Submission.



CF1528F

给定 n,k,求长度为 n 的“好序列” {a} 的贡献和。

“好序列”这样定义:对于 i[1,n][aji]ni+1

其贡献定义为每种颜色的出现次数的 k 次幂之和。

n109,k105

又到了大家最喜欢的多项式环节

转化一下定义,好算。

[aji]ni+1[aji]i

ci=j[aj=i],再转化为

jicji

假设 c 枚举所有 ci=ni, jicji 的序列,答案即为

c(nc1,c2,cn)icik

下面的形式好看,但是上面的限制就不是很行。考虑转化到经典组合对象上。

考虑一棵 n 个点的树和它的 dfn 序。我们可以发现,对 dfn 序的任意前缀,它都代表着一个完整的 i 大小子树。这子树有什么性质是 i 的呢?
考虑儿子个数。我们将这个 dfn 序的每个位置转化成对应节点的儿子个数,可以知道这能枚举所有 ci=n1 的满足性质的 c
等等,n1
我们事实上只要考虑所有 n+1 个点的有标号且确定了根为 1 的树,用这样的树构造出长度为 n+1 的儿子个数序列,删掉最后一个 0 即可。可以发现这样能覆盖所有合法的 c

题意转化完了。
假设 c 枚举所有 ci=nn+1 个点的有标号定根树生成的序列,答案即为

c(nc1,c2,cn)icik

考虑先算所有有标号有根树的贡献,最后除以 n+1 就是答案。考虑

F(x)=xi0ikFi(x)i!

答案就是 1/(n+1)[xn+1/(n+1)!]F(x)

看到这个多叉树形式可以直接考虑拉反了。显然有

xF1(x)=i0ikxii!

能知道答案是

[xnn!](i0ikxii!)n+1

但是你发现下面就不太能推了——反正我是不会了。接下来想要推导,就势必要把 ikvn+1 分离。

考虑引入新元 t。我们让 tik 替换 ik,设

F(x,t)=xi0tikFi(x)i!

答案就是

[xn+1(n+1)!]tF(x,t)|t=1

这样我们再进行如上的推导。记 F(x,t)x 的复合逆是 F1。我们知道

(n+1)![xn+1]tF(x,t)|t=1= n![xn]t(xF1)n+1|t=1= n![xn]t(i0xii!tik)n+1|t=1= n![xn](i0xii!ik)(i0xii!tik)n|t=1= n![xn](i0xii!ik)(i0xii!)n= n![xn]enxi0iki!xi= i=0n(ni)iknni= i=0nj=0i(ni)(ij){kj}j!nni= i=0nj=0i(nj)(njij){kj}j!nni= j=0k(nj){kj}j!i=jn(njij)nni= j=0k(nj){kj}j!i=0nj(nji)nnji= j=0k(nj){kj}j!(1+n)nj

这形式是容易 O(klogk) 求得的。

Submission.

当然您也可以在 i=0n(ni)iknni 这一步停下。我们能发现

i=0n(ni)iknni= [xkk!]i=0n(ni)eixnni= [xkk!](ex+n)n

直接作可以 O(klogk),常数大。Submission.

通过 EI 的载谭 Binomial Sums 技术(一份只包含所需信息的讲解)可以做到 O(k+logn)。目前没实现。

posted @   joke3579  阅读(92)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示