「考试」省选26
T1
dp+多项式。(喜欢的类型)
\(dp[i][j]\)已经插入了\(i\)个区间,当前的序列长度为\(j\)的方案。
目标:\(dp[m][n]\)。
初始化:\(dp[0][0]=1\)
转移:
直接考虑对于\(dp[m][n]\)来说\(dp[0][0]\)的贡献。
设经过的序列长度为\(i\)。
\(A_1+1,A_2+1,A_3+1....A_i+1\)
贡献就是这个序列的乘积乘上\(\binom{m-1}{i-1}\)。
就是考虑爆搜的过程中哪一步走\(dp[i-1][j]\)的转移贡献。
已经限定最后一次也就是第\(m\)次,它必然是第二种转移,所以组合数是\(m-1\)选\(i-1\)。
这样的话非序列部分贡献确定了。
求序列部分的贡献。
可以变换为:
卷积两次即可求出\(F_{n-1}(x)\)。
T2
数据结构
其实关于很具体的证明不是很简单。
但是可以说一下大概的思路。
设\(low(x)\)为\(x\)在\(K\)进制下最低位是谁(那一位是第多少位),\(lowbit(x)\)位最低位上的数。
然后关于\(k\)的讨论其实并不只限于奇偶。
\(k=(2x+1)2^p\)
也就是说提出其中的所有2的因子。
设\(y=(2x+1)2^q\)
这个时候的\(y\)有两种情况。
其中第一种情况必然是一条链。
因为其后继只有一个,原因是2关于\(2x+1\)必然存在逆元,后面的部分已经不互质了所以没必要管,而需要管的仅仅是前面的(2x+1),这样是存在逆元的。
关于第二种情况,这种情况最多跳\(log_kn\)次因为一直在进位,而且每次进位最多跳\(p\)下然后再次进位。
所以跳的次数最多不超过\(plog_kn\)
等到不进位的时候就到了链上,我们可以用数据结构维护一波。
然后还得维护一下在链上进位的次数。
这个很好算,因为每次都加的是\(K^{low(x)}\)那么多。
所以次数就是:\(\frac{n}{K^{low(x)}}\)。
这样根据这个次数和\(lowbit(x)\)可以唯一的确定出一个链头。
我们链上倍增一下就可以找到链头了。
这样子就知道该在哪个线段树里面操作了。
然后暴力怎么维护就怎么维护就可以了,用动态开点比较好。
T3
\(burnside\)
枚举循环节长度:
\(len\)个长度为\(\frac{n}{len}\)的序列构成了长度为\(n\)环.
\(dp[n][m]\)长度为\(n\)的环满足\(m\)个染色的合法方案。
然后考虑求\(dp[n][m]\)。
我们考虑容斥插板。
当前长度为\(n\)的环中\(m\)个被染成了金色。
要求连续长度不能超过\(K\)。
那么我们强制第一个位置没有被染成金色,这样可以防止首尾相接造成的不合法情况。
但是这个位置有\(n\)种选法,同时钦定的这个相当于编号了,而没有编号所以应该除掉\(n-m\)。
然后考虑容斥插板。
枚举每一段的长度,可以得到一个长度为\(n-m\)的变量序列:
\(\{x_i\}\)满足\(\forall i,x_i\in[0,k]\)
同时有:
这样的话就可以直接玩插板容斥了。
设得到的结果为\(r\),那么答案就是:\(dp[n][m]=\frac{n}{n-m}r\)
\(O(\sigma(n))\)