<span>数学专题测试3 题解</span>
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$式,于是可以线性处理。