A. young

大概的意思是说,由低到高考虑不同的二进制位。

形成一个最小生成树,那么最高二进制位不同的情况一定只出现一次。

所以除掉最高位之后的情况形成两个集合,递归下去$dp$就好了。

一个技巧是,将每个方案的最小值的总和,即$\sum \limits_{i}min(i)$转化为$\sum \limits_{i=1}^{\infty}f(min>=i)$。

然而还没有改这个题,所以以上都是我在yy。

 

B. Simple

隐藏的很深的一道题,完全没有思路。

颓过题解之后会发现并不难,题意要求从首位开始的数是最小的。

也就是说首位的字典序最小。

不妨考虑每一个循环同构串$S$,当这个串存在长度小于$|S|$的循环节,那么无论如何循环都无法使首位的字典序最小。

否则,只有把字典序最小的串放到最前面是合法的。

所以只要求出不同长度的不含循环节的串个数就好了。

然后就发现这个东西是显然的莫比乌斯反演,容易发现要求前缀和,顺便推推式子写个杜教筛就好了。

 

C. 小 H 爱染色

容易发现答案是方案数乘对应的多项式,其中方案数是组合数减组合数的形式。

因为组合数中选的个数$m$并不大,可以发现这个组合数实际上是$m$次多项式的形式。

要求的是组合数的平方卷积给定的系数,所以这个玩意将是$3m+1$次多项式的形式。

所以可以通过$NTT$优化插值处理出一些$F$的取值,再通过$F$的取值卷积组合数处理出一些$ans$的取值。

之后直接插值出$ans_n$就可以了。

这样做的复杂度是对的,然而常数很大所以要疯狂卡常才能通过。

一个较好的优化的方法是构造一个奇怪的函数(使组合数与插值点有关),并且保证在想要插值的点的取值相同。

这个方法就很妙,它把原式中很难维护的卷积$ans$式,变成了一个可以递推的简单$ans$式,于是可以线性处理。