Gauss's blog

Gauss's blog

I’d go back to December turn around and make it alright.

「2021.4.1 纪中集训」总结

posted on 2021-04-01 21:12:43 | under 总结 |

无聊的话写在前面

zlj:今天出联考成绩,四校排名我妈已经告诉我了!

随即说了句愚人节快乐......

今天T2居然是道原题?

dyp:不能说非常相似,只能说完全相同!

下午打篮球赛,初中打高中

高中连输两场???

总结

T1

给你一个长度为$n$的序列$\{a_n\}$和$x$,问$\{1,2,\cdots,n\}$有多少个非空子集$S$满足$\forall i,j\in S,a_i\text{ xor }a_j\le x$.

题解

令$i$是满足$2^t\ge x$的最小的$t$,将原序列分为若干组,满足每组数除去最低的$i$位后完全相同.

显然,不同组的两个数异或一定大于$x$,同组的两个数异或不小于$x$当且仅当它们第$i$位不同.

于是对每组分开算贡献,每组只能选$0,1$或$2$个数,前两种情况非常trivial,第三种情况可以将所有数依次插入Trie里,每插入一个数之前计算这个数的贡献即可.

答案即为每组选择的方案数的乘积减一(除去空集).

T2

定义一个序列$a$对答案的贡献为$\max(L(a)-x,0)$,请你计算所有长度为$n$,且每个数取值$1$到$m$的序列的贡献值和.

题解

转化一下贡献$$\max(L(a)-x,0)=\sum_{k=x+1}^n[L(a)\ge k]$$ 于是考虑对每个$k\in[x+1,n]$求出最长连续段大于等于$k$的序列个数.

取个补集,转而考虑求最长连续段小于$k$的序列个数.

用组合意义算是不可能的,这辈子都不可能的.

假设我们将一个序列划分成了$i$个极长连续段,那么划分的方案数为$(m-1)^{n-1}m=\dfrac{m}{m-1}(m-1)^n$

令$f_i$为将长度为$i$的序列划分,且最长连续段的长度小于$k$的方案数.

显然有转移方程$$f_i=(m-1)\sum_{j=1}^{\min(k-1,i)}f_{i-j}$$ 答案即为$\dfrac{m}{m-1}f_n$.

由上述转移方程易知$f$是满足初值为$$f_0=1,f_1=m-1,\cdots,f_{k-2}=(m-1)m^{k-3}$$ 的$k-1$阶常系数线性齐次递推.

于是我们可以将它的生成函数写成$f(x)=\dfrac{p(x)}{q(x)}$,其中$$p(x)=f_0+\left[f_1-(m-1)f_0\right]+\left[f_2-(m-1)f_1-(m-1)f_0\right]+\cdots+\left[f_{k-2}-(m-1)f_{k-3}-\cdots-(m-1)f_0\right]=1$$$$\begin{aligned}q(x)=1-(m-1)x-\cdots-(1-m)x^{k}=\frac{1-[mx+(1-m)x^{k}]}{1-x}\end{aligned}$$ 代入得到$$f(x)=\frac{1-x}{1-[mx+(1-m)x^{k}]}$$ 而我们念念于兹的是$[x^n]f(x)$,即$$\begin{aligned}[x^n]f(x)&=[x^n]\frac{1}{1-[mx+(1-m)x^{k}]}-[x^{n-1}]\frac{1}{1-[mx+(1-m)x^{k}]}\end{aligned}$$ 而$$\begin{aligned}[x^n]\frac{1}{1-[mx+(1-m)x^{k}]}&=[x^n]\sum_{i=0}^{\infty}[mx+(1-m)x^{k}]^i\\&=[x^n]\sum_{i=0}^{\infty}\sum_{j=0}^i{\binom i j}m^{i-j}(1-m)^jx^{i+j(k-1)}\\&=\sum_{i=0}^{\infty}{\binom {n-i(k-1)} i}m^{n-ik}(1-m)^i\end{aligned}$$ 于是我们可以在$O(n/k)$的时间内求出$[x^n]f(x)$的值,总时间复杂度为$$\sum_{k=x+1}^n\frac{n}{k}=O(n\log n)$$