7.21集训作业转载

AGC38E Gachapon

首先可以发现,题目所求是所有的\(i\)都满足条件的期望,相当于是一个\(\max\)的形式

考虑\(min-max\)容斥

\[\max(S)=\sum\limits_{T\neq \empty} (-1)^{|T|-1}\min(T) \]

其中\(\min(T)\)的意义是\(T\)中有一个满足条件的期望

根据期望的定义可知\(E=\sum\limits_{i\geq 1} iPr[x= i]=\sum\limits_{i\geq 0}Pr[x> i]\)

对于\(i\in T\),可以先取出\(B_i-1\)个进行排列,然后对于所有\(i\notin T\)看作同一个物品,并且有无限多个,选出一个的概率为\(p_0\)。如果从这些物品选出\(k\)个进行排列得到的概率就是\(Pr[x>k]\)的概率

\(g(i)=\sum\limits_{k=0}^{B_i-1}\frac{p_i^k}{k!}x^k\)\(F_T(x)=\prod\limits_{i\in T} g(i)=\sum\limits_i \frac{f_i}{i!}x^i\)

那么计算出\(F_T(x)\),那么就可以计算出只考虑\(i\in T\)物品的情况,那么接下来考虑剩下那个无限个物品如何插入生成序列中,那么贡献就为

\[\begin{align} &=\sum\limits_i f_i\sum\limits_{j\geq 0} \binom{i+j}{j}p_0^j\\ &=\sum\limits_i f_i\frac{1}{(1-p_0)^{i+1}} \end{align} \]

那么接下来就是利用DP统计容斥的结果,由于计算贡献的过程跟多项式有关,那么DP的值也需要记录多项式

\(H(i,j)\)表示考虑到前\(i\)个数,\(\sum\limits_{i\in T}A_i=j\)所有情况的多项式之和

\[H(i,j)=H(i-1,j)-g_i(x)H(i-1,j-A_i) \]

直接进行转移是\(O(n^4)\)的,由于\(\sum B_i\leq 400\),也就是说所有\(H(i,j)\)代表的多项式次数不会高于400,那么可以将\(H\)转为点值形式进行转移,那么复杂度为\(O(n^3)\)

Distinct Multiples

题目大意

给定长度为\(n\)的序列\(D\),求出有多少个可能的序列\(A\),满足\(A_i\in [1,M],A_i\neq A_j(i\neq j),D_i|A_i\)

\[n\leq 16 \]

算法讨论

首先需要考虑对\(A_i\neq A_j\)进行容斥,变成\(A_i=A_j\),由于最终合法的答案不能存在\(A_i=A_j\),那么如果强制钦定有\(k\)个二元关系满足\(A_i=A_j\),那么容斥系数就是\((-1)^k\)

那么考虑在钦定若干边必须满足\(A_i=A_j\)下如何计算答案,可以发现的是,对于一个联通块来说,其\(A_i\)都是相同的,并且\(A_i\)可能的取值,就是联通块中\(A_i\)的LCM的倍数

那么事实上对于很多的钦定的边方案都是本质相同的,只要形成的联通块本质相同即可,那么就可以考虑固定一个联通块统计其容斥系数之和

那么相当于求出\(n\)个点的图用奇数边联通的方案数和偶数边联通的方案数

一种非常暴力的做法就是设\(dp(i,j)\)表示\(i\)个点用\(j\)条边连通的方案数,可以在\(O(n^6)\)的时间内计算出答案,但事实上由于我们只关心偶数和奇数的方案数

\[dp(n,m)=\binom{\binom{n}{2}}{m}-\sum\limits_{a=1}^{n-1}\sum\limits_b dp(a,b)\binom{n-1}{a-1}\binom{\binom{n-a}{2}}{m-b} \]

缺陷

在比赛的时候没有强制1为联通块,这样计算的话会算重

其中\(\binom{n-1}{a-1}\)需要强制\(1\)号点是在选在当前进行转移的联通块内部,然后剩下的点是在余下\(n-1\)个点中选,这里强制选择\(1\)因为对于不合法的情况,可能存在多个联通块,但是不能重复计算,因此需要选出一个代表的联通块来计数,注意到如果1所在的联通块不同的话,那么方案一定也是不同的,所以这样做就是可以将方案不重不漏的算出来

那么可以设\(dp(i,0/1)\)表示答案,转移的时候考虑容斥,就是枚举图中的联通块数量不止1个,并且枚举1号节点所在连通的大小,以及使用的边数

\[dp(i,j)=2^{\binom{i}{2}-1}-\sum\limits_{k<i} \sum\limits_{p\in\{0,1\}} dp(k,p)\binom{i-1}{k-1}2^{\binom{i-k}{2}-1} \]

这样就可以做到\(O(n^2)\)转移

那么n个点的容斥系数就是\(dp(n,0)-dp(n,1)\),但事实这个值就是\((-1)^{n-1}(n-1)!\)

证明的话,就是考虑我们这个容斥系数是在干什么,就是我们只有大小为1的联通块是合法的,容斥就是在干把不合法情况减去的工作,对于某一个不合法的状态来说,其的连通块在容斥统计中会被拆解成若干部分进行相乘统计,那么我们容斥系数就是需要将这些统计的方案数乘上容斥系数的和需要变成0,我们记容斥系数关于节点个数的EGF为\(F\)

那么通过将容斥中联通块进行不断组合得到的结果就是\(e^F\),由于只有\(1\)的联通块是合法的,那么要求\(e^F=x+1\),那么说明\(F=\ln(1+x)\),那么其展开式就是\((-1)^{n-1}(n-1)!\)

然后就是通过拆分子集统计答案,设\(dp(s)\)表示当前集合为s的答案,假设\(f(s)\)表示\(s\)集合中的联通块可能的方案数

\[dp(s)=\sum\limits_{t\subseteq s,t\neq \empty} dp(s\backslash t)\times f(t)\times (-1)^{|t|-1}(|t|-1)! \]

时间复杂度\(O(3^n)\),可以通过子集卷积+exp做到\(O(2^nn^2)\)

JOISC 2020 Day 2 遗迹

先说第一种做法

首先考虑在确定\(h\)的情况下如何求出最终高度不为0的位置,那么首先考虑下标最大的位置\(2n\),那么在每一次操作中都是不会改变\(h_{2n}\),那么相当于最终数字为\(h_{2n}\)的位置就在\(2n\)

然后考虑\(2n-1\),同样如果\(h_{2n-1}\neq h_{2n}\)的话,所有操作都是不会影响这个位置,当\(h_{2n-1}=h_{2n}\),那么\(h_{2n-1}\)需要减1,那么这样就可以得到一个做法

\(pos_i\)表示最终数字\(i\)所在的位置,一开始都是0,那么可以考虑从2n开始往小的进行枚举,然后令\(j\in [1,h_i]\)满足\(pos_j= 0\)的最大\(j\),那么可以令\(pos_j=i\)

那么可以对这个过程进行计数,设\(dp(i,j)\)表示考虑了\([i,n]\)的下标位置,当前\(pos\)\(j\)个不等于0的方案数

假设当前\((i,n]\)区间中有\(A\)个位置最终数字=0,\(B\)个位置最终数字\(\neq 0\)

但是注意到这样设置状态的话,对每一种数需要放置两个位置的限制是很难处理的,那么可以强制让这两个位置不等价,最终方案数除以\(2^n\)即可

  • 如果当前加入的是最终数字=0的话,那么只能选在\([1,j]\)中,那么\(dp(i,j)=dp(i+1,j)\times (j-A)\)

  • 如果当前加入的是最终数字\(\neq 0\)的话,那么就不能选在\([1,j]\)之中,一种可能是会扩展\(j\),另一种可能是不会扩展但是又记录不到状态中去,那么解决办法就是在当前转移的时候不考虑加入这个数字带来的影响,当需要扩展\(j\)的时候再统一确定方案数和状态,就是放到之后进行处理,避免状态数的退化

    • 那么首先是没有扩展的情况\(dp(i,j)=dp(i+1,j)\)

    • 存在扩展的情况,那么可以枚举一个\(k\)表示从\(1...j-k\)变成了\(1...j\),那么\(dp(i,j)=\sum\limits_{k\geq 1} \binom{B-j+k}{k-1}\times g(k-1)\times (k+1)\times dp(i+1,j-k)\),其中\(g(k-1)\)表示将\(k-1\)个位置形成一个连续段的方案数

      \(g(x)\)可以通过DP求出,就是如果要形成一个连续段的话,那么\(1\leq x\leq i\)\(x\)个数\(\leq i\),那么设\(f(i,j)\)表示当前枚举的值域为\(i\)的时候,用了\(j\)个位置的方案数

      \(f(i,j)=f(i-1,j)+2j\times f(i-1,j-1)+j\times (j-1)\times f(i-1,j-2)\)

时间复杂度\(O(n^3)\)

还有一种从\(h\)推出最终\(\ne 0\)的位置的判断方法,就是可以维护一个下标集合,记\(a_{i,0},a_{i,1}\)表示初始时候\(i\)这个数所在位置的下标

那么初始令下标集合\(s=\empty\),然后从小到大枚举\(i\),令\(s\cup\{a_{i,0},a_{i,1}\}\),然后取出其中的最大值\(\max s\),并从\(s\)中删除,那么\(\max s\)就是数字\(i\)最终所在的下标

可以从2n枚举,不断放置下标数字在序列中,同样可以用类似的方法得到完全一样的做法,重要的步骤就是

1.强制让这两个位置不等价,最终方案数除以\(2^n\)即可

2.就是放到之后进行处理,避免状态数的退化

A.树

首先可以发现的是,如果我们强制钦定某一个节点是叶子节点的话,在统计加入这个节点的方案数之后就可以将这个节点直接删除,对之后的节点选择父亲没有影响

那么注意到题目中的限制是在一棵树中是叶子节点在另一棵树上是非叶子节点,那么就可以考虑对这个非叶子节点进行容斥

那么对于一个节点相当于有四种选择

  • 在第一棵树中作为叶子节点,在另一棵树中任意放置,贡献的容斥系数是1
  • 在第一颗树中作为叶子节点,在另一棵树中作为叶子节点,贡献的容斥系数是-1
  • 在第一棵树中任意放置,在第二棵树中作为叶子节点,贡献的容斥系数是1
  • 在第一颗树中作为叶子节点,在第二棵树中作为叶子节点,贡献的容斥系数是-1

然后考虑如何计算固定一个叶子节点时候的贡献

对于第一颗树来说,假设当前固定的节点是\(i\)\([1,i-1]\)没有作为叶子的节点有\(k\),那么贡献就是需要乘上k

对于第二棵树来说也是类似的,但是有一点不同的是,在统计\(i\)的贡献的时候,需要记录\(>i\)没有作为叶子节点数量

这样在DP的过程中只能统计一个方向的贡献,在DP时候不能预先知道第二棵的贡献,但是我们可以在DP之前预先确定第二棵树中有多少个节点不作为叶子节点,那么这样就可以进行DP了

那么可以设\(f(i,j,k)\)表示考虑了\([1,i]\)中的点,第一棵树中没有作为叶子的节点有\(j\)个,第二棵树中\([i+1,n]\)没有作为叶子节点有\(k\)的贡献

一开始预处理\(f(1,0,i)=i!\),然后转移就是按照上面四种情况转移

那么对于一个\(n\),答案就是\(\sum f(n-1,i,1)\times i!\)

时间复杂度\(O(n^3)\)

posted @ 2025-07-21 19:48  一位XXS  阅读(9)  评论(0)    收藏  举报