CF2150D Attraction Theory 题解
Update:
- 在 Part 4 中有两处错误,感谢 XiaoZi_qwq 指出。
:::::info[题目基本信息]
考察:组合数学,数学,期望,逆元,数论。
题目简述:
有n 个人站在一条数轴上,令\{p_n\} 为这n 个人所处的位置,一开始时\forall i\in[1,n],p_i=i ,下面你可以进行若干次(可以为0 次)操作:- 选择一个整数
x ,满足x\in[1,n] 。 -
-
- 选择一个整数
现在赋予
数据范围:
-
1\le n\le 2\times 10^5 -
\forall i\in[1,n],1\le a_i\le 10^9 ::::: 好久没见过这么人类智慧的神秘小清新计数题了,还是太吃脑容量了。
Part 1:将题目问题转化:
这道题看起来就很数学,但是
注意到
更加具体地,令
Part 2:对 \{t_n\} 发掘性质:
注意到
- 显而易见地,
\exist 1\le L\le R\le n,\forall i\in[L,R],t_i>0,\forall i\notin[L,R],t_i=0 ,也就是说t_i\ne 0 的i 构成了一段区间。
:::::success[证明]
显然操作不会扩大人与人之间的间距,同时原来初始时t_i\ne 0 的i 就构成了一段区间,那么无论怎么操作都不会影响能否构成区间。
实际上使用了数学归纳法的思想。
::::: - 假定有一个初始
\{t_n\} 序列,容易得到唯一一组满足性质 1 中限制的L,R 以及原序列\{p_n\} 。这个\{t_n\} 序列经过若干次操作后变为了\{t'_n\} ,同样得到类似的L',R' 和原序列\{p'_n\} ,那么\forall i\in[1,n],p'_i\in(L',R')\Rightarrow p_i\in(L,R) 。
:::::success[证明]
考虑反证法。
若p_i\notin(L,R) (其实就是p_i\in\{L,R\} ),那么由于操作的性质,显然能推出p'_i\notin(L',R') ,与条件矛盾。
::::: - 对于每个
\{t_n\} 唯一一组满足性质 1 中限制的L,R ,都又能使得\forall i\in(L,R),t_i\equiv 1\pmod 2 。
:::::success[证明]
考虑数学归纳法。
对于初始时\forall i\in(L,R),t_i=1 ,性质显然成立。
我们假设操作前序列符合性质,注意到多个原来不同位置上的人只会在被操作的位置上移动到同一位置,也就是说只会在被操作的位置上“合并”,所以我们仅需验证被操作位置的t_i 的奇偶性即可。
由于 2,所以i 位置上的所有人以前都不在端点上,所以“合并”时一定是pos-1,pos,pos+1 合并,三个奇数相加仍然是奇数。
:::::Part 3:构造证明充分性:
前面的性质 1,3 对于
\{t_n\} 的可能性作了限制,那么满足这些性质的是否就一定合法呢?
:::::success[证明] 考虑构造。
我们要构造出\{t_n\} 。 - 求出它的
L,R 。 - 在位置
1 处进行t_L 次操作。 - 在位置
n-t_L 处进行t_R 次操作。 -
- 在位置
1 或n 处进行若干次操作平移\{t_n\} 。
:::::Part 4:大力分讨拆贡献:
前面铺垫了这么多,我们终于要算答案了。
注意到我们要枚举t_L 和t_R 的奇偶性,我们要先特判:-
我们直接枚举 $L$,$L$ 处的答案就是 $na_L$。 -
根据 Part 3 的构造过程 5,对于 $R-L+1$ 相同的 $L,R$ 答案是类似的,只是所乘的 $a_i$ 不同,所以我们考虑枚举 $R-L+1$,然后枚举 $x,y\in\{1,2\}$,表示 $t_L$ 和 $t_R$ 的奇偶性。 容易发现,此时对于存在一个 $\{f_n\}$ 满足 $t_L=2f_L+x$ 且 $t_R=2f_R+y$ 同时 $\forall i\in(L,R),t_i=2f_i+1$ 且 $\forall i\notin[L,R],f_i=0$,容易发现 $f_i$ 和 $t_i$ 一一对应,为了方便计算我们后文将计算 $\{f_n\}$ 的数量,再来计算贡献。 容易发现,$\displaystyle\sum_{i=L}^R2f_i=n-(x-1)-(y-1)-(R-L+1)=n-x-y+(R-L+1)+2$,我们记为 $res$,那么我们特判掉 $res<0$ 或 $res\equiv 1\pmod 2$ 的情况,容易发现 $\displaystyle\sum_{i=L}^Rf_i=\frac{res}{2}$,那么 $\{f_n\}$ 的数量可以通过插板法计算,为 $\displaystyle\binom{R-L+\frac{res}{2}}{R-L}$,这个可以预处理阶乘和逆元计算。 $\{f_n\}$ 的数量算出来了我们还不能直接得出答案,注意到 $\forall i\in(L,R)$ 部分任意顺序的 $\{f_n\}$ 均合法,所以 $f_i$ 的期望为 $\dfrac{res}{2(R-L+1)}$,我们也容易得到 $t_i$ 的期望,$t_i$ 的期望乘 $\{f_n\}$($\{t_n\}$)的数量再乘长度为 $R-L+1$ 的 $\{a_n\}$ 的连续子序列和的总和就是 $R-L+1$ 的答案,所以我们还差最后一步:算长度为 $R-L+1$ 的 $\{a_n\}$ 的连续子序列和的总和。 这个东西其实不难,直接推导: $$\begin{aligned}\sum_{l=1}^{n-R+L}\sum_{i=l}^{l+R-L}a_i&=\sum_{l=1}^{n-R+L}sum_{l+R-L}-sum_{i-1}\\&=(\sum_{l=1}^{n-R+L}sum_{l+R-L})-(\sum_{l=1}^{n-R+L}sum_{i-1})\\&=sum^2_n-sum^2_{R-L}-sum^2_{n-R+L-1}\end{aligned}$$ 其中 $\{sum_n\}$ 是 $\{a_n\}$ 的前缀和,$\{sum^2_n\}$ 是 $\{sum_n\}$ 的前缀和,直接预处理即可。
-
太好了我们终于做完了!
时间复杂度为
code
:::::warning[坑点]
看看谁预处理阶乘没有预处理到
看看谁取模取少了?
看看谁算前缀和没加模数?
:::::