「考试」省选26

时间:2021-07-16 22:05:21

T1
dp 多项式。(喜欢的类型)
(dp[i][j])已经插入了(i)个区间,当前的序列长度为(j)的方案。
目标:(dp[m][n])
初始化:(dp[0][0]=1)
转移:
[dp[i][j]= begin{cases} dp[i-1][j] sumlimits_{k=0}^{j-1}dp[i-1][k](k 1)&inot =m\sumlimits_{k=0}^{j-1}dp[i-1][k](k 1)&i=m\end{cases} ]
直接考虑对于(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)
这样的话非序列部分贡献确定了。
求序列部分的贡献。
[prodlimits_{i=1}^{n-1}((i 1)x^1 1x^0)]
可以变换为:
[prodlimits_{i=1}^{n-1}(x^1 (i 1)x^0)]
[F_{n-1}(x)=prodlimits_{i=1}^{n-1}(x i 1)]
[n=2^w,log n]
[F_{n}(x)rightarrow F_{2n}(x)]
[F_{2n}(x)=F_{n}(x)F_{n}(x n)]
[F_{n}(x)=sumlimits_{i=0}^{n}a_ix^i]
[ begin{aligned} F_{n}(x n)&=sumlimits_{i=0}^{n}a_i(x n)^i&=sumlimits_{i=0}^{n}a_isumlimits_{j=0}^{i}binom{i}{j}x^jn^{i-j}\end{aligned}]
卷积两次即可求出(F_{n-1}(x))
[ans=sumlimits_{i}binom{m-1}{i-1}[x^{n-i}]F_{n-1}(x)]

T2
数据结构
其实关于很具体的证明不是很简单。
但是可以说一下大概的思路。
(low(x))(x)(K)进制下最低位是谁(那一位是第多少位),(lowbit(x))位最低位上的数。
然后关于(k)的讨论其实并不只限于奇偶。
(k=(2x 1)2^p)
也就是说提出其中的所有2的因子。
(y=(2x 1)2^q)
这个时候的(y)有两种情况。
[low(y lowbit(y))= begin{cases} low(y)&qgeq plow(y) 1&q<p\end{cases} ]
其中第一种情况必然是一条链。
因为其后继只有一个,原因是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)个染色的合法方案。
[ans=frac{1}{|G|=n}sumlimits_{len|(n,m)}dp[frac{n}{len}][frac{m}{len}]varphi(len)]
然后考虑求(dp[n][m])
我们考虑容斥插板。
当前长度为(n)的环中(m)个被染成了金色。
要求连续长度不能超过(K)
那么我们强制第一个位置没有被染成金色,这样可以防止首尾相接造成的不合法情况。
但是这个位置有(n)种选法,同时钦定的这个相当于编号了,而没有编号所以应该除掉(n-m)
然后考虑容斥插板。
枚举每一段的长度,可以得到一个长度为(n-m)的变量序列:
({x_i})满足(forall i,x_iin[0,k])
同时有:
[sumlimits_{i=1}^{n-m}x_i=m]
这样的话就可以直接玩插板容斥了。
设得到的结果为(r),那么答案就是:(dp[n][m]=frac{n}{n-m}r)
(O(sigma(n)))