老年选手康复训练

学考考完了。虽然身为d类咸鱼选手还是要好好备战一下noi的。

从今天开始进行康复训练,不过白天应该还是要肝文化课。等过几天训练时间应该会多一点。

[CTS2019]随机立方体

这道题现在做了一遍好像有一点sibo啊,可能是考试的时候太紧张了吧。

题意就不写了。

题目要求恰好k个,那我们考虑用至少含i个进行容斥。

那么容斥系数fi需要满足:

[i=k]=∑j=0i(ij)fj

进行二项式反演,得到:

fi=∑j=0i(−1)i−j(ij)[j=k]

即:

fi=(−1)i−k(ik)

由于在i<k时(ik)等于0,因此上面的式子是良定义的。

那么考虑如何计算至少含i个极大数的概率。

首先极大数的行号、列号、bule号(bule代表第三维的名称)一定不是相同的。

比较关键的一点是,我们可以注意到任何钦点i个两两坐标全不同的格子为极大数的概率都是相同的。于是我们可以找一个比较特殊的位置计数,比如让他们的坐标为(1,1,1),(2,2,2),…,(i,i,i)。同时我们钦点a1,1,1<a2,2,2<⋯<ai,i,i。

思考一下,可以发现如果我们只观察至少有一维横坐标≤i的格子,(i,i,i)一定是其中的最大值。如果我们只观察至少有一维横坐标≤i−1的格子,(i−1,i−1,i−1)一定是其中的最大值。以此类推即可。不难发现只要满足上述条件,那么这个方案一定合法。

我们设ai表示所有横坐标至少有一维≤i的格子数。那么满足之前所述条件的概率就是:

∏j=1i1aj

同时还要注意,这只是我们钦点的位置和大小关系之后的答案,所有合法的选取位置和大小关系的方案共有(ni)(mi)(li)∗(i!)3种,其组合意义是分别选出三维的横、纵、bule坐标,再决定大小关系。

后面的方案数可以用预处理阶乘及逆元实现O(1)计算,之前的概率,则可以通过线性求逆元均摊O(1)计算。于是做一组数据就是O(n)的,总复杂度O(Tn)。

[CTS2019]珍珠

F(x)=∑i≥0[imod2=1]i!xi=sinh⁡(x)=ex−e−x2G(x)=∑i≥0[imod2=0]i!xi=cosh⁡(x)=ex+e−x2Ans=∑k=0n−2m(Dk)n![xn]FkGD−k

用二项式定理把Fk和GD−k展开,可以得到:

Ans=12D∑k=0n−2m∑i=0k∑j=0D−k(Dk)(−1)k−i(ki)(D−kj)(2(i+j)−D)nAns=12D∑k=0n−2m∑i=0k∑j=0D−kD!(−1)k−i(2(i+j)−D)n(k−i)!i!(D−k−j)!j!Ans=12D∑k=0n−2m∑i=0k∑j=0D−k(2(i+j)−D)nD!(i+j)!(D−(i+j))!∗(i+j)!i!j!∗(−1)k−i(D−(i+j))!(k−i)!(D−k−j)!Ans=12D∑k=0n−2m∑i=0k∑j=0D−k(2(i+j)−D)n(Di+j)(i+ji)(−1)k−i(D−(i+j)k−i)Ans=12D∑k=0n−2m∑i+j=0D(2(i+j)−D)n(Di+j)∑i=0k(i+ji)(−1)k−i(D−(i+j)k−i)

考虑[xi](1+x)n=(ni),[xi](1−x)n=(−1)i(ni)。

因此

(i+ji)=[xi](1+x)i+j,(−1)k−i(D−(i+j)k−i)=[xk−i](1−x)D−(i+j)∑i=0k(i+ji)(−1)k−i(D−(i+j)k−i)=∑i=0k([xi](1+x)i+j)∗([xk−i](1−x)D−(i+j))=[xk](1+x)i+j(1−x)D−(i+j)Ans=12D∑k=0n−2m∑i=0D(2i−D)n(Di)[xk](1+x)i(1−x)D−i

设ai=(2i−D)n(Di)2D,

Ans=∑k=0n−2m∑i=0Dai[xk](1+x)i(1−x)D−iAns=∑k=0n−2m[xk](∑i=0Dai(1+x)i(1−x)D−i)

考虑先把∑i=0Dai(1+x)i(1−x)D−i算出来,最后一个个加。

至于这个,可以使用分治fft大法。

什么一个log,分治fft天下第一。

[CTS2019]氪金手游

现在想想怎么又比较简单啊。

考虑把关系树随便钦点一个当根。

由于正向边(向儿子连的边,表示必须早于儿子)和反向边同时存在,因此比较麻烦。考虑用容斥将反向边变为正向边,即:选出一个反向边子集S,强制这些边必须被违反,其余反向边随意。注意正向边是永远需要满足的。计算得这样计算出的方案有(−1)|S|的贡献。

对于一种选法,原树用正向边分成了若干联通块。对于一个点i,设si表示是它的子树中的点的集合。如果只考虑这棵子树,我们显然要满足i是第一个被抽出来的,概率就是wi∑j∈siwj,接下来可以分成若干子树递归。

那么若干种方案就可以合起来算概率了。我们设dpi,j表示以i为根的子树,当(∑k∈siwk)=j时,目前满足所有条件的情况乘以他们的系数的概率和。转移比较容易得到。

[ZJOI2019]开关

这真是一道好题,被送退役得心服口服。

先说几个结论:

我们设f~表示集合幂级数f在快速沃尔什变换(FWT)后的形式。

那么:

[xS]f~=∑T(−1)|S∩T|[xT]f

从FWT的意义中可以看出。

∑T(−1)|S∩T|=2n[S=∅]

其中n代表全集的大小。这和子集容斥的原理是相似的。

∑T[xT]f~=2n[x∅]f

用前一个式子不难证明。

现在说题目的解法。

根据题目描述,我们设[xS]f表示第一次到达状态S的期望步数。为了分析方便,我们也可以将其看成是从状态S到空集的期望步数。那么对于S≠∅,我们就有:

[xS]f=(∑ipi∑jpj[xSΔ{i}]f)+1

为了更方便的表达这个式子,我们设形式幂级数g,其中当S={i}时,[xS]g=pi∑jpj,否则[xS]g=0。

于是上式可以表达为:

f=(∑TxT)+fg+cx∅

其中c是某个不确定的系数,起到补偿∅不符合该式的作用。我们尝试进行FWT,对于∑TxT,它是x∅进行FWT后的结果,因此其FWT−1的结果为x∅,所以其FWT后的结果为2nx∅。因此:

[xS]f~=2n[S=∅]+[xS]f~[xS]g~+c(1−[xS]g~)[xS]f~=2n[S=∅]+c

考虑[x∅]g~=∑ipi∑jpj=1,因此将S=∅代入上式可得c=−2n。

那么对于S≠∅,就有:

[xS]f~=−2n1−[xS]g~

代入FWT−1的式子中,我们就有:

[xS]f=12n(∑T(−1)|S∩T|[xT]f~)=[x∅]f~2n−(∑T≠∅(−1)|S∩T|11−[xT]g~)

而由于[x∅]f=0,根据之前的结论,∑T[xT]f~=0,所以[x∅]f~=−(∑T≠∅[xT]f~)=∑T≠∅2n1−[xT]g~

因此:

[xS]f=12n(∑T(−1)|S∩T|[xT]f~)=(∑T≠∅11−[xT]g~)−(∑T≠∅(−1)|S∩T|11−[xT]g~)[xS]f=∑T≠∅[|S∩T|≡1(mod2)]21−[xT]g~

代入[xT]g~=∑i(−1)[i∈T]pi∑jpj,得1−[xT]g~=∑i[i∈T]2pi∑jpj,回代入原式,得:

[xS]f=∑T≠∅[|S∩T|≡1(mod2)]∑jpj∑i∈Tpi[xS]f=(∑jpj)∗(∑T≠∅[|S∩T|≡1(mod2)]1∑i∈Tpi)

由于∑jpj非常小,因此后面的式子可以通过简单的dp计算出来。

[ZJOI2019]语言

考场上只会写3个log的我太菜了。

考虑对于一个点,它能交流的所有点就是经过它的链的并。

我们可以用线段树来维护一个点集的连通并的点数(即最小的使得某些点都在内的连通块的点数),具体做法不讲了(想必这篇博客没有人看的233,如果有人问再加上去吧)。再用树上差分思想,在点上添加事件,加上线段树合并,就做完了。

虽然是一个log的但我写出来跑的有点慢,可能我太菜了。

LOJ #575 不等关系

一道不算很难的容斥题。

考虑最简单的容斥方法,用至少违背零个大于号−至少违背一个大于号+至少违背两个大于号…来计算,对于至少违背k个大于号的方案数,可以发现当我们选定了哪些位置违背以后,限制就只剩下小于号了。此时长度为n+1的排列会被分成m部分,大小分别为a1,a2,…,am,每一段内要满足大小递增。那么此时的答案就是:

(n+1a1,a2,…,am)=(n+1)!∏i=1mai!

(n+1)!对于所有方案都是相同的,我们可以不管它。于是只要将所有段的大小的阶乘的逆元相乘就是方案数。

首先考虑暴力做法,我们根据字符串s先将排列划分为m段,大小分别为a1,a2,…,am(这和上面的定义不一样,只是我懒得换字母了),由于容斥的关系,一些段可能会并起来。我们假定违背了其中k个大于号,合并后段的大小分别为b1,b2,…,bm−k,那么这种方案的贡献为(−1)k(∏i=1m−k1bi!)。

那么考虑dp,我们设fi表示只考虑前i段,所有方案的贡献和。设Si表示a的前i项和。那么我们只要枚举第i段会与前面的几段合并,就可以得出方程:

fi=∑j=0i−1(−1)i−j+1fj1(Si−Sj)!

就得到了O(n2)的做法。

可以注意到,由于和式中的最后一项非常复杂,因此很难优化成卷积形式。我们考虑更换一种方法,改设fi表示只考虑排列的前i个,所有方案的贡献和。值得注意的是如果i和i+1之间是小于,即原本在一段内的,那么我们可以任意取fi的值,因为我们将看到它对后面是没有影响的。我们再设ai表示i和i+1之间是否用大于号连接(即可以断开),特别的,a0=an+1=1。设Si表示a的前i项和。

根据之前的思路,易得:

fi=∑j=0i−1(−1)Si−Sj+1ajfj1(i−j)!

变化一下,得:

(−1)Sifi=∑j=0i−1(aj(−1)Sjfj)∗(−1(i−j)!)

可以发现,虽然其转化为简单的卷积式比较困难,但是借助分治fft,我们就可以先将(−1)Sifi算出来,再乘上ai贡献给后面了。复杂度O(nlog2⁡n)。

所以说,分治fft天下第一。