旧题重做

[ZJOI2016]小星星

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

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

fx,i,S=(i,j)EAB=S,AB=fx,i,Afy,j,B

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

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

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

fx,i,S=(i,j)EAB=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重复有限次之后,之后的转移都形如xtransx,t[:1]transx,t[:2]x,然后不断重复。

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

另一个重要的事实:t满足性质A,当且仅当xtransx,t[:1]transx,t[:2]x都是合法转移。这是因为如果有一个有意义的串出现在了t中,它一定会出现无限多次,于是一定会在不断重复的xtransx,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的数目。这种情况的答案就是dpmi,x。如果一次都没有回到根,这样的方案是唯一的,直接走就行。复杂度O(nm)

[CTS2019]珍珠

之前推的式子不够优雅!

一句话题意:求

ans=n!k=0n2m[yk][xn](ex+ex2+yexex2)D

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

ans=n!2Dk=0n2m[yk][xn]((ex+ex)+y(exex))D=n!2Dk=0n2m[yk][xn]((1+y)ex+(1y)ex)D=n!2Dk=0n2m[yk][xn]i=0D(Di)e(2iD)x(1+y)i(1y)Di=i=0D(Di)n!2Dk=0n2m[yk][xn]e(2iD)x(1+y)i(1y)Di

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

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

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

fi=j=0i[yj](1+y)ik=0n2mj[yk](1y)Di=j=0i(ij)k=0n2mj(1)k(Dik)=j=0i(ij)(1)n2mj(Di1n2mj)=i!(Di1)!j=0i(1)n2mjj!(n2mj)!1(ij)!(D1n+2m(ij))!

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