旧题重做

[ZJOI2016]小星星

容斥是官方做法,不过用集合并卷积也可以推出同样的dp式子。

树形dp,令fx,i,S表示以x为根的子树,x映射到i,子树全体映射到S的合法方案数。 考虑给当前的x添加一个以y为根的子树,令新的以x为根的dp数组为f′,有:

fx,i,S′=∑(i,j)∈E∑A∪B=S,A∩B=∅fx,i,Afy,j,B

枚举合法的i,j,余下的就是一个看上去像子集卷积的东西。

然而最终只需要S为全集的方案,如果A与B有交,那么A∪B必然小于新的x的子树大小,最终不可能对答案产生贡献。

于是考虑去掉A∩B=∅的限制,仍然保证答案的正确性,转化为集合并卷积:

fx,i,S′=∑(i,j)∈E∑A∪B=Sfx,i,Afy,j,B

于是令f^表示f对最后一维做莫比乌斯变换之后的结果,有:

f^x,i,S′=f^x,i,S∑(i,j)∈Ef^y,j,S

初始状态下fx,i,S=[S={i}],很容易得到莫比乌斯变换之后的结果。dp中不需要进行反演,保留莫比乌斯变换后的形式计算即可。

最后将根的全集方案数用莫比乌斯逆变换的公式算出来即可,复杂度也是O(n32n)。

[CTS2019]重复

我们记tk表示将字符串t重复k次形成的字符串。

显然,我们先正难则反,统计不包含任何有意义字符串(简称为性质A)的无限重复串的个数。

根据题意,可以设置一个只含有一个串s的AC自动机。对于一个状态i,有ki个字符可以转移到非根节点,假设是ci,1,ci,2,…,ci,ki,且按照升序排序,剩余字符只能转移到根。那么不难发现,满足性质A的串只能从≥ci,ki的字符中进行转移(称为合法转移),粗略考虑,发现我们需要统计的是长度为m的字符串中,重复无限次仍然始终走合法转移的字符串有多少。

然而重复无限次不太具有可操作性,进一步观察一个串重复无限次后,在自动机上的转移规律。我们令transx,s表示从状态x接受一个字符串s,最终会走到什么状态。可以发现这样一个事实:当k足够大的时候,必然有trans0,tk=trans0,tk+1=trans0,tk+2=⋯,这是因为所有可能在tk+1的后缀中出现的s的前缀一定被包含在tk的后缀中了。因此,如果记x=trans0,tk,我们就有理由定义trans0,t∞=x,于是,在t重复有限次之后,之后的转移都形如x→transx,t[:1]→transx,t[:2]→⋯→x,然后不断重复。

不难发现transx,t=x,还可以证明满足这一点的x是唯一的,因为如果满足这一点,那么就有transx,tk=x,当k足够大时,x一定被包含在tk的后缀中,于是就是唯一的。

另一个重要的事实:t∞满足性质A,当且仅当x→transx,t[:1]→transx,t[:2]→⋯→x都是合法转移。这是因为如果有一个有意义的串出现在了t∞中,它一定会出现无限多次,于是一定会在不断重复的x→transx,t[:1]→transx,t[:2]→⋯→x转移中出现,造成一个不合法的转移。

综上所述,我们可以先枚举x,统计所有满足transx,t=x的串中,满足性质A的串个数:令dpi,j表示长度为i的满足transx,t=j,且都是合法转移的字符串t的数目。转移方程容易得到,最后dpm,x就是答案。这个动态规划是O(n2m)的,还是无法通过本题。

再观察合法转移的性质:由于只能从≥ci,ki的字符中进行转移,因此每个点最多只有一个转移不走到根,也就是说,如果不走到根,那么合法转移的路径是唯一的。于是我们枚举从x开始,一直走合法转移,第一次走到根的步数i。令dpi,j表示长度为i的满足trans0,t=j,且都是合法转移的字符串t的数目。这种情况的答案就是dpm−i,x。如果一次都没有回到根,这样的方案是唯一的,直接走就行。复杂度O(nm)。

[CTS2019]珍珠

之前推的式子不够优雅!

一句话题意:求

ans=n!∑k=0n−2m[yk][xn](ex+e−x2+yex−e−x2)D

有了y的指标作为辅助,推式子的过程可以精简很多:

ans=n!2D∑k=0n−2m[yk][xn]((ex+e−x)+y(ex−e−x))D=n!2D∑k=0n−2m[yk][xn]((1+y)ex+(1−y)e−x)D=n!2D∑k=0n−2m[yk][xn]∑i=0D(Di)e(2i−D)x(1+y)i(1−y)D−i=∑i=0D(Di)n!2D∑k=0n−2m[yk][xn]e(2i−D)x(1+y)i(1−y)D−i

关键的一步是在枚举i以后,一个二元混合多项式F(x,y)被分离成F1(x)F2(y)的形式,于是x和y的部分可以分离,并且x的部分结果是显然的:

ans=∑i=0D(Di)n!2D([xn]e(2i−D)x)(∑k=0n−2m[yk](1+y)i(1−y)D−i)ans=∑i=0D(Di)(2i−D)n2D(∑k=0n−2m[yk](1+y)i(1−y)D−i)

到了这一步就可以用分治fft大法O(nlog2⁡n)解决问题了!但是如果想追求更好的做法,可以继续推导。下面关注对fi=∑k=0n−2m[yk](1+y)i(1−y)D−i的求和:

fi=∑j=0i[yj](1+y)i∑k=0n−2m−j[yk](1−y)D−i=∑j=0i(ij)∑k=0n−2m−j(−1)k(D−ik)=∑j=0i(ij)(−1)n−2m−j(D−i−1n−2m−j)=i!(D−i−1)!∑j=0i(−1)n−2m−jj!(n−2m−j)!1(i−j)!(D−1−n+2m−(i−j))!

最后就化成了一个卷积式,可以O(nlog⁡n)解决问题。可以发现(1+y)k和(1−y)k并不完全对称,因为(1−y)k的系数前缀和有好的封闭形式。