1 条题解
-
0
自动搬运
来自洛谷,原作者为

BJpers2
**搬运于
2025-08-24 22:09:35,当前版本为作者最后更新于2020-07-02 16:01:36,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
本题有两种主流做法,一种是生成函数,一种是异或卷积。
但惊人的是这两个做法最终能够得到完全相同的结果。
一、 生成函数
把转为概率,则第步达成目标的概率的EGF为
$$f_e(x)=\prod \frac {e^{p_ix}+(-1)^{s_i}e^{-p_ix}} 2 $$代入可得第步恰好回到原点概率的EGF为
稍微解释一下,求积中那个无非限定了这个开关需要被拨动奇数次还是偶数次,如果则为双曲余弦函数,表示必须拨动偶数次;反之为双曲正弦函数,表示必须拨动奇数次。
假如把上述两个生成函数分别转为OGF(即把的系数乘一个)和。再设第步恰好第一次达成目标的概率生成函数为。
那么有(考虑通过枚举第一次达成目标的时刻求)。于是问题变为求。
设$\phi_{1-k}=2^n[e^{kx}]f_e(x)=[x^k]\prod (x^{p_i}+(-1)^{s_i}x^{-p_i})=[x^{1-k}]\prod (1+(-1)^{s_i}x^{2p_i})$(注意这里是的实数,所以用这个记号有些不严谨)。最后一步推导用到了的性质。
同理定义。
根据转OGF之后恰为(它们都对应数列)。我们有
$$h(x)=\frac {\sum \frac{\phi_{1-i}}{2^n}\frac 1 {1-ix}}{\sum \frac{\gamma_{1-i}}{2^n}\frac 1 {1-ix}}=\frac {\phi_0+\sum_{i\ne1} \phi_{1-i}\frac {1-x} {1-ix}}{\gamma_0+\sum_{i\ne1} \gamma_{1-i}\frac {1-x} {1-ix}} $$以上推导和大部分题解是一致的,但是很多题解里都出现了很不清真的式子。实际上这里有一个很优美的推导
设分子为,分母为。注意到,且。
那么
$$h'(1)=\frac{u'(1)v(1)-v'(1)u(1)}{v^2(1)}=u'(1)-v'(1)=\sum_{i\ne 1}\frac{\phi_{1-i}-\gamma_{1-i}}{i-1}=\sum_{i>0}\frac {\gamma_i-\phi_i} i $$其实做到这一步已经很好,直接背包求和即可,但是为了凸显它和下面一种方法的联系,我需要进一步用的定义展开这个式子。
$$\begin{aligned} h'(1)& = \sum_{i>0} \frac{\gamma_i-\phi_i}{i}\\ & = \sum_T \frac{1}{\sum_{i\in T}2p_i}(1-(-1)^{\sum_{i\in T}s_i})\\ & = \sum_{T} \frac{[|S\cap T|\equiv 1 \bmod 2]}{\sum_{i\in T} p_i} \end{aligned} $$这个式子有无比清晰的组合意义:
对所有与目标集合的交大小为奇数的集合,求第一次拨动中的某个开关需要的期望步数之和。
二、异或卷积
设表示第一次把开关拨成集合的状态所需的期望步数,目标是求。
可列出方程:
$$f_S= \begin{cases} 0 & S=\varnothing \\ 1+\sum_{S\oplus\{j\}} f_Sp_j & S\ne \varnothing \end{cases} $$注意到方程类似于异或卷积,那么另设
$$g_S= \begin{cases} -1 & S=\varnothing \\ p_{i} & S = \{i\} \\ 0 & |S|>1 \end{cases} $$$$h_S= \begin{cases} 2^n-1 & S=\varnothing \\ -1 & S \ne \varnothing \end{cases} $$容易知道(可以通过把的另外个方程相加,结合导出)。
通过简单计算,我们可以求出经过沃尔什变换(也就是维DFT)的结果
$$\tilde h_S=\begin{cases} 0 & S=\varnothing \\ 2^n & S\ne \varnothing \end{cases} $$特别地,,除此之外任意。
根据,我们可以求出
$$\tilde f_S=\begin{cases} \sum_{T} \frac{2^n}{1-\sum_{i}(-1)^{[i\in T]}p_i}& S=\varnothing \\ -\frac{2^n}{1-\sum_{i}(-1)^{[i\in T]}p_i} & S\ne \varnothing \end{cases} $$的表达式可利用导出。
最后手动做一次沃尔什逆变换(也就是维IDFT)得出的表达式。(以下默认非空)
$$\begin{aligned} f_S & =\frac 1 {2^n}(\tilde f_{\varnothing}+\sum_{T\ne \varnothing} (-1)^{|S\cap T|}\tilde f_T) \\ & = \sum_{T} \frac1{1-\sum_{i}(-1)^{[i\in T]}p_i}+\sum_T(-1)^{|S\cap T|}-\frac1{1-\sum_{i}(-1)^{[i\in T]}p_i} \\ & = \sum_{T} \frac{1-(-1)^{S\cap T}}{\sum_{i}p_i-\sum_{i}(-1)^{[i\in T]}p_i} \\ & = \sum_{T} \frac{2[|S\cap T|\equiv 1 \bmod 2]}{2\sum_{i\in T}p_i}\\ & = \sum_{T} \frac{[|S\cap T|\equiv 1 \bmod 2]}{\sum_{i\in T} p_i} \end{aligned} $$这很明显跟方法一的结论一致。
三、遗留的问题
在给出上述两种方法之后,这道题当中仍然存在一个很大的谜团。那就是,如何从实际角度解答:为什么「第一次抵达状态的期望时间」恰好等于「所有与交大小为奇数的集合的首次被操作期望时间之和」。
这个等式的两端都有着无比清晰的实际意义,但是奈何本人才疏学浅,不知如何构建它们之间的实际联系。如果有高手看出了其中的奥妙,还望不吝赐教。
四、一些拓展思考
为了解决上一节中的问题,本人尝试对每个开关有种状态的状态寻找普遍的规律,得到了如下表达式
$$f(S)=\sum_{T}\frac {1-\omega^{-\sum S_iT_i}}{\sum(1-\omega^{Ti})p_i} $$其中是重数为的多重集,表示这一维的重数。,也即次单位根。可以代入验证其正确性。
这个式子不再有清晰的组合意义,而且从各种角度来看都很奇怪。因为分子分母都是复数,很难想象以的概率拨动第个开关会有什么现实的意义。
五、 本题做法
根据方法一给出的如下表达式:
我们只需求得和,设,不难发现本质不同的只有个。那么做个物品体积分别为的01背包即可。时间复杂度。
当然这里有一个优化。我们本质上是求的各项系数,所以可以先对每个二项式求,求和之后在回去。
这看起来是,但注意到,只在等个位置有值。那么把所有相同的一起处理则可以获得调和级数的复杂度,也就是经典的。(最劣情况应该是前个数每个来一个,这时候算出来是)。
然后再做的多项式就可以了。
放一下的代码:
#include<iostream> #include<cstdio> #define FOR(i,a,b) for(int i=a;i<=b;i++) using namespace std; const int M=50050,P=998244353; int n,m,x,A,j,iv[M],b[M],f[M],g[M]; int main(){ scanf("%d",&n); FOR(i,1,n) scanf("%d",&b[i]); f[0]=g[0]=iv[1]=1; FOR(i,1,n)for(scanf("%d",&x),j=m,m+=x;~j;j--) (f[j+x]+=b[i]?P-f[j]:f[j])%=P,(g[j+x]+=g[j])%=P; FOR(i,2,m) iv[i]=1ll*iv[P%i]*(P-P/i)%P; FOR(i,1,m) (A+=1ll*(g[i]-f[i]+P)*iv[i]%P*iv[2]%P*m%P)%=P; cout<<A<<'\n'; }
- 1
信息
- ID
- 4316
- 时间
- 1000ms
- 内存
- 500MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者