发现自己期望太差了,写写题。
大部分题目来自这个题单
绿豆蛙的归宿
给出一张 n n n 个点 m m m 条边的有向无环图,起点为 1 1 1 ,终点为 n n n ,每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都能够到达终点。从起点出发,走向终点。 到达每一个顶点时,如果该节点有 k k k 条出边,可以选择任意一条边离开该点,并且走向每条边的概率为 1 k \frac{1}{k} k 1 。求出从起点走到终点的所经过的路径总长度期望。
数据范围:n ≤ 1 0 5 , m ≤ 2 × 1 0 5 n\le 10^5, m\le 2\times 10^5 n ≤ 1 0 5 , m ≤ 2 × 1 0 5 。
典题。由于是有向无环图,我们可以进行一个拓扑 dp。我们设 f u f_u f u 为 u u u 到终点的期望步数,那么我们枚举走那条出边可以得到转移方程:
f u = 1 d o u t u ∑ ( u , v ) ∈ E f v f_u=\frac{1}{dout_u} \sum\limits_{(u, v)\in E} f_v
f u = d o u t u 1 ( u , v ) ∈ E ∑ f v
初始状态为:f e n d = 0 f_{end}=0 f e n d = 0 。
时间复杂度 O ( n ) O(n) O ( n ) 。
单选错位
试卷上共有 n n n 道单选题,第 i i i 道单选题有 a i a_i a i 个选项,这 a i a_i a i 个选项编号是 1 , 2 , 3 , … , a i 1,2,3,\ldots,a_i 1 , 2 , 3 , … , a i ,每个选项成为正确答案的概率都是相等的。将第 i i i 个位置的正确答案填到第 i + 1 i+1 i + 1 个位置(第 n n n 个位置的答案填到第 1 1 1 个位置),求期望答对多少题。
数据范围:n ≤ 1 0 7 n\le 10^7 n ≤ 1 0 7 。
我们进行一个分类讨论。
当 a i > a i + 1 a_i >a_{i+1} a i > a i + 1 时,我们需要先确保第 i i i 题的答案不在第 a i + 1 + 1 ∼ a i a_{i+1}+1\sim a_i a i + 1 + 1 ∼ a i 这段区间,然后再保证这两道题的答案相同,因此第 i + 1 i+1 i + 1 题答对的概率是:a i + 1 a i × 1 a i 2 × a i = 1 a i \frac{a_{i+1}}{a_{i}}\times \frac{1}{a_i^2}\times a_i=\frac{1}{a_i} a i a i + 1 × a i 2 1 × a i = a i 1 。
同理我们可以得到当 a i ≤ a i + 1 a_i\le a_{i+1} a i ≤ a i + 1 时第 i + 1 i+1 i + 1 题答对的概率是 1 a i + 1 \frac{1}{a_{i+1}} a i + 1 1 。因此第 i + 1 i+1 i + 1 题答对的概率为 1 max ( a i , a i + 1 ) \frac{1}{\max(a_i,a_{i+1})} m a x ( a i , a i + 1 ) 1 。
最后我们把每道题答对的概率相加即为答案。时间复杂度 O ( n ) O(n) O ( n ) 。
Vasya and Magic Matrix
一个 n n n 行 m m m 列的矩阵,每个位置有权值 a i , j a_{i,j} a i , j 。给定一个出发点,每次可以等概率的移动到一个权值小于当前点权值的点(不能移动就停止),同时得分加上两个点之间欧几里得距离的平方,问得分的期望。
数据范围:n , m ≤ 1000 n, m\le 1000 n , m ≤ 1 0 0 0 。
我们设 f i , j f_{i, j} f i , j 为 ( i , j ) (i, j) ( i , j ) 这个位置一直移动到不能移动为止的期望步数。我们可以从小到大加入权值,这样就不会受其他权值的影响。我们设 S S S 为已经加入的点的点集,我们在考虑完一批值相同的点之后才会将它们加入 S S S 。
我们来考虑如何转移 f i , j f_{i, j} f i , j 。转移其实很简单,就是它到场上每个点的距离和。因此转移为
f x , y = ∑ ( a , b ) ∈ S ( ( x − a ) 2 + ( y − b ) 2 + f a , b ) = ∑ ( a , b ) ∈ S ( x − a ) 2 + ∑ ( a , b ) ∈ S ( y − b ) 2 + ∑ ( a , b ) ∈ S f a , b \begin{aligned}
f_{x, y}&=\sum \limits_{(a, b)\in S} \left((x-a)^2+(y-b)^2+f_{a, b} \right)\\
&=\sum \limits_{(a, b)\in S} (x-a)^2+\sum \limits_{(a, b)\in S}(y-b)^2+\sum \limits_{(a, b)\in S} f_{a, b}
\end{aligned}
f x , y = ( a , b ) ∈ S ∑ ( ( x − a ) 2 + ( y − b ) 2 + f a , b ) = ( a , b ) ∈ S ∑ ( x − a ) 2 + ( a , b ) ∈ S ∑ ( y − b ) 2 + ( a , b ) ∈ S ∑ f a , b
后面 f f f 的和可以直接维护,而前面的平方可以拆开,这样就只用维护 x x x 的和,x x x 的平方和以及 y y y 的这些信息了。
时间复杂度 O ( n m ) O(nm) O ( n m ) 。
OSU!
一共有 n n n 次操作,每次操作只有成功与失败之分,成功对应 1 1 1 ,失败对应 0 0 0 ,n n n 次操作对应为 1 1 1 个长度为 n n n 的 01 串。在这个串中连续的 X X X 个 1 1 1 可以贡献 X 3 X^3 X 3 的分数,这 x x x 个 1 1 1 不能被其他连续的 1 1 1 所包含(也就是极长的一串 1 1 1 )。给出每个操作的成功率 p i p_i p i ,求出期望分数。
数据范围:n ≤ 1 × 1 0 5 n \leq 1 \times 10 ^ 5 n ≤ 1 × 1 0 5 。
根据期望的性质:E ( x + y ) = E ( x ) + E ( y ) E(x+y)=E(x)+E(y) E ( x + y ) = E ( x ) + E ( y ) ,因此我们可以得到:E ( ( x + 1 ) 3 ) = E ( x 3 + 3 x 2 + 3 x + 1 ) = E ( x 3 ) + 3 E ( x 2 ) + 3 E ( x ) + 1 E((x+1)^3)=E(x^3+3x^2+3x+1)=E(x^3)+3E(x^2)+3E(x)+1 E ( ( x + 1 ) 3 ) = E ( x 3 + 3 x 2 + 3 x + 1 ) = E ( x 3 ) + 3 E ( x 2 ) + 3 E ( x ) + 1 。因此我们设 a i a_i a i 为最后以 i i i 为末尾的连续 1 1 1 段长度的期望,b i b_i b i 为为最后以 i i i 为末尾的连续 1 1 1 段长度平方的期望,f i f_i f i 为前 i i i 个操作的期望得分,那么我们就能得到方程:
a i = ( a i − 1 + 1 ) × p i a_i=(a_{i-1}+1)\times p_i
a i = ( a i − 1 + 1 ) × p i
b i = ( b i − 1 + 2 a i − 1 + 1 ) × p i b_i=(b_{i-1}+2a_{i-1}+1)\times p_i
b i = ( b i − 1 + 2 a i − 1 + 1 ) × p i
我们可以发现 x + 1 x+1 x + 1 和 x x x 的答案只相差了 3 E ( x 2 ) + 3 E ( x ) + 1 3E(x^2)+3E(x)+1 3 E ( x 2 ) + 3 E ( x ) + 1 ,因此得到
f i = f i − 1 + ( 3 × b i − 1 + 3 × a i − 1 + 1 ) × p i f_i=f_{i-1}+(3\times b_{i-1}+3\times a_{i-1}+1)\times p_i
f i = f i − 1 + ( 3 × b i − 1 + 3 × a i − 1 + 1 ) × p i
时间复杂度 O ( n ) O(n) O ( n ) 。
Fish
有 n n n 条鱼,每天有一对鱼相遇,彼此相遇的概率是一样的。如果两条标号为 i i i 和 j j j 的鱼见面,第一只吃第二只的概率为 a i , j a_{i,j} a i , j ,第二只会吃第一只的概率为 a j , i = 1 − a i , j a_{j,i}=1-a_{i,j} a j , i = 1 − a i , j 。该过程进行到湖里只剩下一条鱼。请你算出每只鱼最后存活在湖里的可能性。
数据范围:n ≤ 18 n\le 18 n ≤ 1 8 。
简单状压。我们可以设 f s f_{s} f s 为 s s s 这些鱼都存活下来的概率。转移时我们就可以枚举哪两只鱼相遇,同时看谁吃掉谁。假设 i i i 吃掉 j j j 之后的状态为 T T T ,s s s 状态中还剩下 x x x 条鱼,则转移为:
f T ← f s × a i , j x × ( x − 1 ) f_T\leftarrow \frac{f_s \times a_{i, j}}{x\times (x-1)}
f T ← x × ( x − 1 ) f s × a i , j
这里分母没有除以二的原因是作者直接 i , j i, j i , j 都是全部枚举的,每个会计算两遍就达到了分母除以二的效果。
时间复杂度 O ( n 2 2 n ) O(n^22^n) O ( n 2 2 n ) 。
换教室
有 n n n 节课程,v v v 个教室,e e e 条道路,每节课程原先是在第 c i c_i c i 个教室上课,可以申请换到第 d i d_i d i 个教室上课。每节课结束后都会从当前教室选择耗费体力最少的道路到下一个教室上课。
现在有 m m m 次申请换教室的机会(可以不用完),对于第 i i i 节课程,申请通过的概率为 p i p_i p i ,每节课程只能申请一次。问怎么申请才能让他移动消耗的体力值的期望最小,求出最小值。
数据范围:n , m ≤ 2000 , v ≤ 300 , e ≤ 90000 n,m\le 2000, v\le 300, e\le 90000 n , m ≤ 2 0 0 0 , v ≤ 3 0 0 , e ≤ 9 0 0 0 0 。
我们先跑一遍 floyd,求出两点之间的最短路,方便后面的 dp。
我们设 f [ i ] [ j ] [ 0 / 1 ] f[i][j][0/1] f [ i ] [ j ] [ 0 / 1 ] 为当前考虑到第 i i i 节课程,用了 j j j 次申请机会,当前这节课程是否申请的期望。分析一下就能得出以下转移方程:
f [ i ] [ j ] [ 0 ] = min ( f [ i ] [ j ] [ 0 ] , f [ i − 1 ] [ j ] [ 0 ] + d i s t [ c [ i − 1 ] ] [ c [ i ] ] ) ; f [ i ] [ j ] [ 0 ] = min ( f [ i ] [ j ] [ 0 ] , f [ i − 1 ] [ j ] [ 1 ] + d i s t [ d [ i − 1 ] ] [ c [ i ] ] ∗ p [ i − 1 ] + d i s t [ c [ i − 1 ] ] [ c [ i ] ] ∗ ( 1 − p [ i − 1 ] ) ) ; \begin{aligned}
f[i][j][0] &= \min(f[i][j][0], f[i - 1][j][0] + dist[c[i - 1]][c[i]]);\\
f[i][j][0] &= \min(f[i][j][0], f[i - 1][j][1] + dist[d[i - 1]][c[i]] * p[i - 1] + dist[c[i - 1]][c[i]] * (1 - p[i - 1]));
\end{aligned}
f [ i ] [ j ] [ 0 ] f [ i ] [ j ] [ 0 ] = min ( f [ i ] [ j ] [ 0 ] , f [ i − 1 ] [ j ] [ 0 ] + d i s t [ c [ i − 1 ] ] [ c [ i ] ] ) ; = min ( f [ i ] [ j ] [ 0 ] , f [ i − 1 ] [ j ] [ 1 ] + d i s t [ d [ i − 1 ] ] [ c [ i ] ] ∗ p [ i − 1 ] + d i s t [ c [ i − 1 ] ] [ c [ i ] ] ∗ ( 1 − p [ i − 1 ] ) ) ;
当前申请的转移方程也同理可以推出,这里就不再写出。
时间复杂度 O ( n 3 + n m ) O(n^3+nm) O ( n 3 + n m ) 。
Expected diameter of a tree
给一片森林,q q q 次询问,每个询问两个点,问在这两个点所在的树中各随机选取两个点,将这两个点连接起来组成的新树,它的直径的期望值是多少。
数据范围:n , q ≤ 1 0 5 n, q\le 10^5 n , q ≤ 1 0 5
我们可以首先求出所有连接情况直径的和,最后再除以 s i z x × s i z y siz_x\times siz_y s i z x × s i z y 即可。
我们先设 a n s x ans_x a n s x 为 x x x 这棵树的直径,m x u mx_u m x u 为 u u u 在树中最远能走多远。我们最终的直径一定是这样一个形式:max ( a n s x , a n s y , m x x + m x y + 1 ) \max (ans_x, ans_y, mx_x+mx_y+1) max ( a n s x , a n s y , m x x + m x y + 1 ) 。我们枚举一棵树中的点 x x x ,考虑另一棵树中有多少 y y y 能让 m x x + m x y + 1 mx_x+mx_y+1 m x x + m x y + 1 成为最终的答案。
我们假设 d x = max ( a n s x , a n s y ) dx=\max(ans_x, ans_y) d x = max ( a n s x , a n s y ) ,那么我们移项可得:m x y ≥ d x − m x x − 1 mx_y\ge dx - mx_x-1 m x y ≥ d x − m x x − 1 。我们只需要找出所有满足这个条件的 y y y 的数量以及它们的 m x mx m x 之和。这个东西可以直接前缀和搞。
最后我们考虑时间复杂度,我们可以枚举点的时候枚举小树的点。同时我们可以进行一个记忆化。可以证明这样的时间复杂度为 O ( n n ) O(n\sqrt n) O ( n n ) 。
亚瑟王
玩家有一套卡牌,共 n n n 张。游戏时,玩家将 n n n 张卡牌排列成某种顺序,排列后将卡牌按从前往后依次编号为 1 − n 1 - n 1 − n 。本题中,顺序已经确定,即为输入的顺序。每张卡牌都有一个技能。第 i i i 张卡牌的技能发动概率为 p i p_i p i ,如果成功发动,则会对敌方造成 d i d_i d i 点伤害。也只有通过发动技能,卡牌才能对敌方造成伤害。基于现实因素以及小 K 非洲血统的考虑,p i p_i p i 不会为 0 0 0 ,也不会为 1 1 1 ,即 0 < p i < 1 0 < p_i < 1 0 < p i < 1 。 一局游戏一共有 r r r 轮。在每一轮中,系统将从第一张卡牌开始,按照顺序依次考虑每张卡牌。在一轮中,对于依次考虑的每一张卡牌:
如果这张卡牌在这一局游戏中已经发动过技能,则如果这张卡牌不是最后一张,则跳过之(考虑下一张卡牌); 否则(是最后一张),结束这一轮游戏。
2. 否则(这张卡牌在这一局游戏中没有发动过技能),设这张卡牌为第 i i i 张,将其以 p i p_i p i 的概率发动技能。如果技能发动,则对敌方造成 d i d_i d i 点伤害,并结束这一轮。如果这张卡牌已经是最后一张(即 i i i 等于 n n n ),则结束这一轮;否则,考虑下一张卡牌。
请帮助小 K 求出这一套卡牌在一局游戏中能造成的伤害的期望值。
数据范围:1 ≤ T ≤ 444 , 1 ≤ n ≤ 220 , 0 ≤ r ≤ 132 , 0 < p i < 1 , 0 ≤ d i ≤ 1000 1 \leq T \leq 444, 1 \leq n \leq 220, 0 \leq r \leq 132, 0 < p_i < 1, 0 \leq d_i \leq 1000 1 ≤ T ≤ 4 4 4 , 1 ≤ n ≤ 2 2 0 , 0 ≤ r ≤ 1 3 2 , 0 < p i < 1 , 0 ≤ d i ≤ 1 0 0 0 。
我们可以对每个卡牌算出它发动的概率 D i D_i D i ,那么最终的伤害的期望就是每个卡牌造成的伤害再乘上它发动的概率之和。
我们现在就要求出所有卡牌的概率。我们可以发现第一张卡牌不发动的概率为 ( 1 − p 1 ) r (1-p_1)^{r} ( 1 − p 1 ) r ,发动的概率为 1 − ( 1 − p 1 ) r 1-(1-p_1)^r 1 − ( 1 − p 1 ) r 。而对于后面的卡牌,我们发现如果在一轮中,它前面的卡牌发动过,那么它就没法发动。因此我们设 f i , j f_{i, j} f i , j 为在这 r r r 轮中,前 i i i 张卡牌,发动 j j j 张的概率。转移就看是否发动当前这一张即可。
发动这一张,那么转移为:
f i , j ← f i − 1 , j − 1 × ( 1 − ( 1 − p j ) r − j + 1 ) f_{i, j}\leftarrow f_{i-1, j-1}\times (1-(1-p_j)^{r-j+1})
f i , j ← f i − 1 , j − 1 × ( 1 − ( 1 − p j ) r − j + 1 )
不发动这一张,转移为:
f i , j ← f i − 1 , j × ( 1 − p j ) r − j f_{i, j}\leftarrow f_{i-1, j}\times (1-p_j)^{r-j}
f i , j ← f i − 1 , j × ( 1 − p j ) r − j
最终我们求的 D i D_i D i 就是 ∑ j = 0 min ( i − 1 , r ) f i − 1 , j × ( 1 − ( 1 − p i ) r − j ) \sum \limits_{j=0}^{\min(i-1, r)}f_{i-1, j}\times (1-(1-p_i)^{r-j}) j = 0 ∑ m i n ( i − 1 , r ) f i − 1 , j × ( 1 − ( 1 − p i ) r − j ) 。
时间复杂度 O ( n m ) O(nm) O ( n m ) 。
游走
给定一个 n n n 个点 m m m 条边的无向连通图,顶点从 1 1 1 编号到 n n n ,边从 1 1 1 编号到 m m m 。在该图上进行随机游走,初始时在 1 1 1 号顶点,每一步以相等的概率随机选择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数。当到达 n n n 号顶点时游走结束,总分为所有获得的分数之和。 现在,请你对这 m m m 条边进行编号,使得获得的总分的期望值最小。
数据范围:n ≤ 500 , m ≤ 125000 n\le 500, m\le 125000 n ≤ 5 0 0 , m ≤ 1 2 5 0 0 0 。
我们发现边的数量太多不好求每条边的期望,但是如果我们求出了每个点期望经过的次数 f u f_u f u ,那么一条边 ( x , y ) (x, y) ( x , y ) 期望经过的次数就是 f u d e g u + f v d e g v \frac{f_u}{deg_u}+\frac{f_v}{deg_v} d e g u f u + d e g v f v 。
现在只需要求出 f u f_u f u 。我们可以把转移的式子写出来:
f u = ∑ ( u , v ) ∈ E f v d e g v + [ u = 1 ] f_u=\sum \limits_{(u, v)\in E}\frac{f_v}{deg_v} +[u=1]
f u = ( u , v ) ∈ E ∑ d e g v f v + [ u = 1 ]
高斯消元即可。时间复杂度 O ( n 3 ) O(n^3) O ( n 3 ) 。
分手是祝愿
B 君在玩一个游戏,这个游戏由 n n n 个灯和 n n n 个开关组成,给定这 n n n 个灯的初始状态,下标为从 1 1 1 到 n n n 的正整数。
每个灯有两个状态亮和灭,我们用 1 1 1 来表示这个灯是亮的,用 0 0 0 表示这个灯是灭的,游戏的目标是使所有灯都灭掉。
但是当操作第 i i i 个开关时,所有编号为 i i i 的约数(包括 1 1 1 和 i i i )的灯的状态都会被改变,即从亮变成灭,或者是从灭变成亮。
B 君发现这个游戏很难,于是想到了这样的一个策略,每次等概率随机操作一个开关,直到所有灯都灭掉。
这个策略需要的操作次数很多,B 君想到这样的一个优化。如果当前局面,可以通过操作小于等于 k k k 个开关使所有灯都灭掉,那么他将不再随机,直接选择操作次数最小的操作方法(这个策略显然小于等于 k k k 步)操作这些开关。
B 君想知道按照这个策略(也就是先随机操作,最后小于等于 k k k 步,使用操作次数最小的操作方法)的操作次数的期望。
数据范围:n ≤ 100000 n\le 100000 n ≤ 1 0 0 0 0 0 。
首先我们考虑 k = n k=n k = n 的测试点,我们可以发现高位的灯不可能由低位的灯给按灭,而且我们为了按灭所有灯所做的所有操作都不能省略。因此我们有一个方案:从高位往低位按,模拟即可。这样我们就能算出最小操作次数 x x x 。
我们再考虑随机操作。我们可以假设当前局面还需要按 i i i 次才能全灭(我们设 f i f_i f i 为从按 i i i 次全灭走到按 i − 1 i-1 i − 1 次全灭的状态的期望步数),由于我们操作的顺序不会影响结果,因此我们在这个局面随机按一次有 i n \frac{i}{n} n i 的概率走到 f i − 1 f_{i-1} f i − 1 ,有 n − i n \frac{n-i}{n} n n − i 的概率走到 f i + 1 f_{i+1} f i + 1 。因此转移方程为:
f i = i n + n − i n ( f i + 1 + f i + 1 ) f_i=\frac{i}{n}+\frac{n-i}{n}(f_{i+1}+f_i+1)
f i = n i + n n − i ( f i + 1 + f i + 1 )
可以得到 f i = ( n − i ) f i + 1 + n i f_i=\frac{(n-i)f_{i+1}+n}{i} f i = i ( n − i ) f i + 1 + n 。初始状态 f n = 1 f_n=1 f n = 1 ,最终答案为 k + ∑ i = k + 1 x f i k+\sum \limits_{i=k+1}^x f_i k + i = k + 1 ∑ x f i 。
时间复杂度 O ( n n ) O(n\sqrt n) O ( n n ) 或者可以做到 O ( n log n ) O(n\log n) O ( n log n ) 。
仓鼠找sugar II
给定一棵树,随机选取两个点 a , b a, b a , b ,从 a a a 开始随机游走(走每个出边的概率相同),期望走多少步到 b b b 。
数据范围:n ≤ 1 0 5 n\le 10^5 n ≤ 1 0 5 。
树上随机游走模板题。
我们先分析边有边权的情况。设 f u f_u f u 为 u u u 期望走多远走到它的父亲节点。
f u = w u , f a + ∑ v ∈ s o n u ( w u , v + f v + f v ) d e g u f_u=\frac{w_{u, fa}+\sum\limits_{v\in son_u} (w_{u, v}+f_v+f_v)}{deg_u}
f u = d e g u w u , f a + v ∈ s o n u ∑ ( w u , v + f v + f v )
分母是向每条出边走的概率都相同,分子第一项是直接向父亲走,第二项是先向儿子走,再从儿子走回来再走向父亲的距离。我们继续推式子。
f u = w u , f a + ∑ v ∈ s o n u ( w u , v + f v + f v ) d e g u = w u , f a + ∑ v ∈ s o n u ( w u , v + f v ) + ( d e g u − 1 ) f v d e g u = w u , f a + ∑ v ∈ s o n u ( w u , v + f v ) = ∑ ( u , v ) ∈ E w u , v + ∑ v ∈ s o n u f v \begin{aligned}
f_u&=\frac{w_{u, fa}+\sum\limits_{v\in son_u} (w_{u, v}+f_v+f_v)}{deg_u}\\
&=\frac{w_{u, fa}+\sum\limits_{v\in son_u} (w_{u, v}+f_v)+(deg_u-1)f_v}{deg_u}\\
&=w_{u, fa}+\sum\limits_{v\in son_u} (w_{u, v}+f_v)\\
&=\sum \limits_{(u, v)\in E} w_{u, v}+\sum \limits_{v\in son_u}f_v
\end{aligned}
f u = d e g u w u , f a + v ∈ s o n u ∑ ( w u , v + f v + f v ) = d e g u w u , f a + v ∈ s o n u ∑ ( w u , v + f v ) + ( d e g u − 1 ) f v = w u , f a + v ∈ s o n u ∑ ( w u , v + f v ) = ( u , v ) ∈ E ∑ w u , v + v ∈ s o n u ∑ f v
而在本题中就是 w = 1 w=1 w = 1 的情况,这时式子变为:
f u = d e g u + ∑ v ∈ s o n u f v f_u=deg_u+\sum \limits_{v\in son_u}f_v
f u = d e g u + v ∈ s o n u ∑ f v
也就是子树所有点的度数和,这个值就等于 2 × s i z u − 1 2\times siz_u-1 2 × s i z u − 1 。
在本题中我们可以固定一个根,让每个节点往上走,这时每条边的贡献就是 ( 2 × s i z u − 1 ) × s i z u (2\times siz_u-1)\times siz_u ( 2 × s i z u − 1 ) × s i z u 。最后换根 dp 一下就可以。
时间复杂度 O ( n ) O(n) O ( n ) 。
Game on Tree
给定一棵有根树,结点编号从 1 1 1 到 n n n 。根结点为 1 1 1 号结点。
对于每一次操作,等概率的选择一个尚未被删去的结点并将它及其子树全部删去。当所有结点被删除之后,游戏结束;也就是说,删除 1 1 1 号结点后游戏即结束。
要求求出删除所有结点的期望操作次数。
数据范围:n ≤ 1 0 5 n\le 10^5 n ≤ 1 0 5 。
设 f i f_i f i 为 i i i 号点被选中的次数,那么我们要求的答案为 E ( ∑ f u ) = ∑ E ( f u ) E(\sum f_u)=\sum E(f_u) E ( ∑ f u ) = ∑ E ( f u ) ,也就是每个点被选中的概率之和。
我们考虑一个点如何才能被选中,也就是它在它任意一个祖先选中之前被选中,而它有 d e p u − 1 dep_u-1 d e p u − 1 个祖先,因此它排在所有祖先之前的概率是 1 d e p u \frac{1}{dep_u} d e p u 1 。因此答案为 ∑ 1 d e p u \sum \frac{1}{dep_u} ∑ d e p u 1 。
时间复杂度 O ( n ) O(n) O ( n ) 。
重建
给定一张 n n n 个点的完全图,给出每条边的出现概率,求出最终成为一颗生成树的概率。
数据范围:n ≤ 50 n\le 50 n ≤ 5 0 。
矩阵树定理其实求的是这么个玩意:
∑ T ∈ T r e e ∏ e ∈ T w e \sum_{T\in Tree}\prod_{e\in T} w_e
T ∈ T r e e ∑ e ∈ T ∏ w e
但是这题我们要求的东西是这个玩意:
∑ T ∈ T r e e ∏ e ∈ T p e ∏ e ∉ T ( 1 − p e ) \sum_{T\in Tree}\prod_{e\in T} p_e\prod_{e\not \in T}(1-p_e)
T ∈ T r e e ∑ e ∈ T ∏ p e e ∈ T ∏ ( 1 − p e )
我们可以把后面的式子化开:
∑ T ∈ T r e e ∏ e ∈ T p e ∏ e ∉ T ( 1 − p e ) = ∑ T ∈ T r e e ∏ e ∈ T p e ∏ e ( 1 − p e ) ∏ e ∈ T ( 1 − p e ) = ∏ e ( 1 − p e ) ∑ T ∏ e ∈ T p e 1 − p e \begin{aligned}
\sum_{T\in Tree}\prod_{e\in T} p_e\prod_{e\not \in T}(1-p_e)&=\sum_{T\in Tree}\prod_{e\in T} p_e\frac{\prod_{e}(1-p_e)}{\prod_{e\in T}(1-p_e)}\\
&=\prod_{e}(1-p_e)\sum_{T}\prod_{e\in T}\frac{p_e}{1-p_e}
\end{aligned}
T ∈ T r e e ∑ e ∈ T ∏ p e e ∈ T ∏ ( 1 − p e ) = T ∈ T r e e ∑ e ∈ T ∏ p e ∏ e ∈ T ( 1 − p e ) ∏ e ( 1 − p e ) = e ∏ ( 1 − p e ) T ∑ e ∈ T ∏ 1 − p e p e
我们可以把每条边的边权弄成 p e 1 − p e \frac{p_e}{1-p_e} 1 − p e p e ,然后矩阵树定理即可。
时间复杂度 O ( n 3 ) O(n^3) O ( n 3 ) 。
随机树
一棵含 n n n 个叶结点的二叉树可以通过如下方式生成:初始时只有根结点。首先,将根结点展开(本题中的展开是指给一个叶结点添上左、右两个子结点);然后,等概率地随机将两个叶结点中的一个展开,即生成以下两棵树之一:之后,每次在当前二叉树的所有叶结点中,等概率地随机选择一个,将其展开。
不断地重复这一操作,直至产生 n n n 个叶结点为止。对于这样随机生成的一颗 n n n 个叶子节点的二叉树,求出叶节点的平均深度的数学期望、树最大深度的数学期望。
数据范围:n ≤ 100 n\le 100 n ≤ 1 0 0 。
第一问很好解决。我们设 f i f_i f i 为 i i i 个叶子节点的树的叶子的平均深度,展开一个叶子节点,那么深度总和平均下来会增加 f i − 1 + 2 f_{i-1}+2 f i − 1 + 2 。因此转移方程为:
f i = ( i − 1 ) f i − 1 + f i − 1 + 2 i = f i − 1 + 2 i f_i=\frac{(i-1)f_{i-1}+f_{i-1}+2}{i}=f_{i-1}+\frac{2}{i}
f i = i ( i − 1 ) f i − 1 + f i − 1 + 2 = f i − 1 + i 2
而对于第二问,有一个公式:E ( x ) = ∑ P ( i ≤ x ) E(x)=\sum P(i\le x) E ( x ) = ∑ P ( i ≤ x ) 。也就是随机变量 x x x 的期望就等于对于所有 i i i ,i ≤ x i\le x i ≤ x 的概率之和。
这样我们可以设 g i , j g_{i, j} g i , j 为有 i i i 个叶子,树深度大于等于 j j j 的概率。转移时我们枚举一颗子树内有多少叶子,然后令它的叶子节点深度大于等于 j − 1 j-1 j − 1 即可。同时这样我们会计算两遍两棵子树深度都大于 j − 1 j-1 j − 1 的情况,减去即可。
因此转移为:
g i , j = 1 i − 1 ∑ k = 1 i − 1 ( f k , j − 1 + f i − k , j − 1 − f k , j − 1 × f i − k , j − 1 ) g_{i, j}=\frac{1}{i-1}\sum\limits_{k=1}^{i-1} (f_{k, j-1}+f_{i-k, j-1}-f_{k, j-1}\times f_{i-k, j-1})
g i , j = i − 1 1 k = 1 ∑ i − 1 ( f k , j − 1 + f i − k , j − 1 − f k , j − 1 × f i − k , j − 1 )
然后根据我们上面的公式,我们就可以得到最终的答案:∑ i = 1 n − 1 f n , i \sum \limits_{i=1}^{n-1}f_{n, i} i = 1 ∑ n − 1 f n , i 。
补充:关于 g i , j g_{i, j} g i , j 的转移过程中,前面除去 i − 1 i-1 i − 1 的原因:
我们设 P k P_k P k 为一颗左儿子有 k k k 个叶子,右儿子有 i − k i-k i − k 个叶子的树,深度大于 j j j 的概率,根据上面的分析我们可以得到 P k = ( f k , j − 1 + f i − k , j − 1 − f k , j − 1 × f i − k , j − 1 ) P_k=(f_{k, j-1}+f_{i-k, j-1}-f_{k, j-1}\times f_{i-k, j-1}) P k = ( f k , j − 1 + f i − k , j − 1 − f k , j − 1 × f i − k , j − 1 ) 。
我们再设 P k ′ P_k' P k ′ 为生成一颗左儿子有 k k k 个叶子,右儿子有 i − k i-k i − k 个叶子的树的概率,那么我们上面求的 g i , j g_{i, j} g i , j 即为 ∑ k = 1 i − 1 P k ′ P k \sum\limits_{k=1}^{i-1}P_k'P_k k = 1 ∑ i − 1 P k ′ P k 。因此我们要证明的就是 P k ′ = 1 i − 1 P_k'=\frac{1}{i-1} P k ′ = i − 1 1 。
我们考虑把生成的这个过程用 L L L (分裂左儿子)和 R R R (分裂右儿子)来表示,那么最终生成这棵树的序列即为一个长度为 i − 2 i-2 i − 2 ,且有 k − 1 k-1 k − 1 个 L L L ,i − k − 1 i-k-1 i − k − 1 个 R R R 的序列(根节点一开始被分裂)。我们就能知道这个操作序列的排列有 ( i − 2 ) ! ( k − 1 ) ! ( i − k − 1 ) ! \frac{(i-2)!}{(k-1)!(i-k-1)!} ( k − 1 ) ! ( i − k − 1 ) ! ( i − 2 ) ! 种。
而对于 L L L 和 R R R 内部的排布,当我们有 1 1 1 个 L L L 时我们分裂 L L L 只有 1 1 1 种选择,两个 L L L 就能有两种选择,以此类推 L L L 内部的排列就有 ( i − 1 ) ! (i-1)! ( i − 1 ) ! 种。R R R 同理有 ( i − k − 1 ) ! (i-k-1)! ( i − k − 1 ) ! 种。我们用乘法原理把这些步骤乘起来,就能得到一共有 ( i − 2 ) ! (i-2)! ( i − 2 ) ! 种左儿子有 k k k 个的树,也就和 k k k 无关了。因此这样做才是正确的。
时间复杂度 O ( n 3 ) O(n^3) O ( n 3 ) 。
游戏
有 n n n 个办公室,编号为 l ∼ l + n − 1 l\sim l+n-1 l ∼ l + n − 1 ,当检查完编号为 i i i 的办公室后这个办公室的人会通知所有编号为 i i i 的倍数的办公室的人认真工作。
对于一个检查办公室的顺序 p p p ,当检查完 p 1 , p 2 ⋯ p x p_1, p_2\cdots p_x p 1 , p 2 ⋯ p x 这些办公室后所有办公室都开始认真工作,那么就把 x x x 称为 p p p 的检查时间。
求出对于所有顺序 p p p ,它们的检查时间之和。
数据范围:l , n ≤ 1 0 7 l, n\le 10^7 l , n ≤ 1 0 7 。
我们发现后面的办公室是没法更新前面的办公室的。因此我们先从前往后扫一遍,用类似埃筛的思想筛出除了自己之外无法被别的办公室更新的点的数量 x x x ,我们称之为有效点。
显然,一个顺序的检查时间就等于它最后出现的有效点的位置。我们可以算出有多少个无效点会在最后一个有效点之后:
k k k 个有效点会将序列分为 k + 1 k+1 k + 1 段,那么就期望有 n − k k + 1 \frac{n-k}{k+1} k + 1 n − k 个点会在最后一个有效点之后。那么最后一个有效点的位置期望就是 n − n − k k + 1 = n k + n − n + k k + 1 = k ( n + 1 ) k + 1 n-\frac{n-k}{k+1}=\frac{nk+n-n+k}{k+1}=\frac{k(n+1)}{k+1} n − k + 1 n − k = k + 1 n k + n − n + k = k + 1 k ( n + 1 ) 。
而我们算出的是期望值,我们只需要乘一下有多少个顺序就可以得到答案。因此最终答案为 k k + 1 ( n + 1 ) ! \frac{k}{k+1}(n+1)! k + 1 k ( n + 1 ) ! 。
时间复杂度 O ( n log log n ) O(n\log\log n) O ( n log log n ) 。
yyf hates dagequ
给你一些卡牌的技能,技能分为2 2 2 种类型:
加分,每连击 c c c 次有 p p p 的概率加 s s s 分
改判,每连击 c c c 次有 p p p 的概率触发强判定效果,持续 t t t 个节奏图标(设连击数为 c c c 的倍数时为第 i i i 个节奏图标,则强判定效果在第 [ i + 1 , i + t ] [i+1,i+t] [ i + 1 , i + t ] 个节奏图标被触发)
这些技能在连击数为c c c 的倍数且连击数不为 0 0 0 时有概率触发,多个技能可以同时触发。其中,加分技能有 s c o r e \mathrm{score} s c o r e 个,改判技能有 j u d g e \mathrm{judge} j u d g e 个。
再给你 n n n 个节奏图标(crimson000 是按给出的顺序击打的)crimson000 击打的原始(相对于“强判定效果”修正后)结果,分为 2 2 2 ,1 1 1 ,0 0 0 三种。在”强判定效果”的持续期间内所有的击打结果 1 1 1 会视作击打结果 2 2 2 ,击打结果 0 0 0 仍视作击打结果 0 0 0 ,击打结果 2 2 2 仍视作击打结果 2 2 2 。下文中的“击打结果”若无说明均指修正后的击打结果。
“连击数”的定义为到目前为止连续的击打结果为 2 2 2 的次数(若这次的击打结果为 2 2 2 则这次击打也算入当前的连击数,否则当前的连击数为 0 0 0 )。
多个“强判定效果”可以重叠,但持续时间不会叠加(设当前“强判定效果”剩余时间为 t 1 t_1 t 1 ,此时同时触发两个“强判定效果”,持续时间分别为 t 2 t_2 t 2 和 t 3 t_3 t 3 ,则下一次击打时的“强判定效果”剩余时间为 max ( t 1 − 1 , t 2 , t 3 ) \max(t_1-1,t_2,t_3) max ( t 1 − 1 , t 2 , t 3 ) )。
一次击打的得分为这次的击打结果乘以当前的连击数加一。即:设当前的击打结果为 x x x ,当前的连击数为 c o m b o \mathrm{combo} c o m b o ,则这次击打的得分为 x ∗ ( c o m b o + 1 ) \mathrm{x*(combo+1)} x ∗ ( c o m b o + 1 ) 。最终得分为每次(共 n n n 次)击打的得分之和加上加分技能的加分之和
请求出 crimson000 这次被歌暴打的期望得分。
数据范围:5 ≤ n ≤ 1000 5 \le n \le 1000 5 ≤ n ≤ 1 0 0 0 ,0 ≤ s c o r e ≤ 1000 0 \le \mathrm{score} \le 1000 0 ≤ s c o r e ≤ 1 0 0 0 ,0 ≤ j u d g e ≤ 1000 0 \le \mathrm{judge} \le 1000 0 ≤ j u d g e ≤ 1 0 0 0 ,1 ≤ c ≤ 5 1 \le c \le 5 1 ≤ c ≤ 5 ,0.01 ≤ p ≤ 0.99 0.01 \le p \le 0.99 0 . 0 1 ≤ p ≤ 0 . 9 9 ,1 ≤ s ≤ 10 1 \le s \le 10 1 ≤ s ≤ 1 0 ,1 ≤ t ≤ 5 1 \le t \le 5 1 ≤ t ≤ 5 。
我们可以注意到改判持续的时间很短,因此我们可以直接把它记录到状态里面。
因此我们设 f [ i , j , k ] f[i, j, k] f [ i , j , k ] 为当前该打第 i i i 个音符,已经有了 j j j 个 combo,改判还有 k k k 个音符结束的期望得分。我们注意到加分的操作只和 combo 数有关,因此我们可以预处理出一个数组 s c [ i ] sc[i] s c [ i ] ,为当 combo 数为 i i i 时期望加的分数。
转移时我们就看当前 a i a_i a i 和 k k k ,当 a i = 0 a_i=0 a i = 0 或 k = 0 , a i = 1 k=0, a_i=1 k = 0 , a i = 1 的情况很好处理,而对于其他情况,我们就要考虑当前是否有可能触发改判操作。
首先一个直观的想法就是枚举集合,看触发哪些改判操作。这样转移的复杂度会达到 O ( 2 j u d g e ) O(2^{\mathrm{judge}}) O ( 2 j u d g e ) 。我们考虑优化。
我们可以注意到当一个 t t t 更大的改判执行时,t t t 小的改判执不执行已经不重要了,因此我们可以先对改判操作排序,然后预处理出当某个改判作为 t t t 最大的改判执行的概率。而我们在转移的时候我们就可以枚举那个改判持续的时间是多少,这样只用枚举 t t t 个数就可以完成转移。
时间复杂度 O ( n 2 t 2 ) O(n^2t^2) O ( n 2 t 2 ) 。
概率充电器
概率充电器由 n − 1 n-1 n − 1 条导线连通了 n n n 个充电元件。进行充电时,每条导线 ( u , v ) (u, v) ( u , v ) 是否可以导电以概率 p u , v p_{u, v} p u , v 决定,每一个充电元件自身是否直接进行充电也由概率 q u q_u q u 决定。随后电能可以从直接充电的元件经过通电的导线使得其他充电元件进行间接充电。求出进入充电状态的元件个数的期望。
数据范围:n ≤ 1 0 5 n\le 10^5 n ≤ 1 0 5 。
我们设 f u f_u f u 为 u u u 充上电的概率,那么答案就是 ∑ i = 1 n f i \sum_{i=1}^n f_i ∑ i = 1 n f i 。
我们考虑一个点充上电的概率来自哪里:
它自己充上电的 q i q_i q i 。
它子树中的电传到他这里。
电从它父亲传到它。
我们可以先考虑第二种,然后再一次 dfs 来统计第三种。
下文中设 u u u 为父亲,v v v 为儿子。
我们考虑第二种的转移。我们设 P ( A ) P(A) P ( A ) 为通过其他方式 u u u 充上电的概率(也就是当前的 f u f_u f u ,我们设为 f u ′ f_u' f u ′ ),P ( B ) P(B) P ( B ) 为 v v v 传给它电的概率。那么我们根据概率的公式,我们可以得到:
f u = P ( A ) + P ( B ) − P ( A B ) = f u ′ + f v × p u , v − f u ′ × f v × p u , v \begin{aligned}
f_u&=P(A)+P(B)-P(AB)\\
&=f_u'+f_v\times p_{u, v}-f_u'\times f_v\times p_{u, v}
\end{aligned}
f u = P ( A ) + P ( B ) − P ( A B ) = f u ′ + f v × p u , v − f u ′ × f v × p u , v
这样就完成了对子树的统计,而对于父亲来的电,我们先把这颗子树对父亲的贡献去掉。
我们假设更新完了 u u u 通过上面三种情况来电的概率,那么我们设 P ( A ) P(A) P ( A ) 为 u u u 通过除去 v v v 子树以外的来电的概率,P ( B ) P(B) P ( B ) 为 v v v 子树给 u u u 供上电的概率,那么可以得到等式:
f u = P ( B ) + P ( A ) − P ( A B ) f_u=P(B)+P(A)-P(AB)
f u = P ( B ) + P ( A ) − P ( A B )
其中 P ( B ) = f v × p u , v P(B)=f_v\times p_{u, v} P ( B ) = f v × p u , v ,那么我们就可以得到 P ( A ) = f u − P ( B ) 1 − P ( B ) P(A)=\frac{f_u-P(B)}{1-P(B)} P ( A ) = 1 − P ( B ) f u − P ( B ) 。
我们再考虑更新 f v f_v f v 。我们设 f v ′ f_v' f v ′ 为更新前的 f v f_v f v ,那么还是根据那个公式,我们可以得到:
f v = f v ′ + P ( A ) × p u , v − f v × P ( A ) × p u , v f_v=f_v'+P(A)\times p_{u, v}-f_v\times P(A)\times p_{u, v}
f v = f v ′ + P ( A ) × p u , v − f v × P ( A ) × p u , v
时间复杂度 O ( n ) O(n) O ( n ) 。
Intergalaxy Trips
给定一张 n n n 个点的有向完全图,i → j i \to j i → j 的边每天出现的概率均为 p i , j p_{i,j} p i , j ,若 i = j i = j i = j ,有 p i , j = 1 p_{i,j} = 1 p i , j = 1 。每天可以选择一条存在的出边走过去或停留在原地不动。求最优策略下从 1 1 1 到 n n n 的期望天数。
数据范围:n ≤ 1 0 3 n \le 10^3 n ≤ 1 0 3 。
我们设 f u f_u f u 为 u → n u\to n u → n 的期望步数,那么显然 f n = 0 f_n=0 f n = 0 。我们考虑转移。
我们可以发现,如果有一条 ( u , v ) (u, v) ( u , v ) 的边出现了,那么当 f v > f u f_v>f_u f v > f u 时,我们一定不会去走 ( u , v ) (u, v) ( u , v ) 这条边。因为我们这样走的期望步数还会增加,还不如直接走个自环。而当如果所有 f v ′ < f v f_{v'}<f_v f v ′ < f v 的 ( u , v ′ ) (u, v') ( u , v ′ ) 这条边不存在时,我们才会走 ( u , v ) (u, v) ( u , v ) 这条边。
因此我们可以初步写出一个方程:
f u = ∑ v f v < f u p u , v f v ∏ k f k < f v ( 1 − p u , k ) + f u ∏ v f v < f u ( 1 − p u , v ) + 1 f_u=\sum_{v}^{f_v<f_u}p_{u, v}f_v\prod _{k}^{f_k<f_v}(1-p_{u, k})+f_u\prod _{v}^{f_v<f_u}(1-p_{u,v})+1
f u = v ∑ f v < f u p u , v f v k ∏ f k < f v ( 1 − p u , k ) + f u v ∏ f v < f u ( 1 − p u , v ) + 1
移项得到:
f u = ∑ v f v < f u p u , v f v ∏ k f k < f v ( 1 − p u , k ) + 1 1 − ∏ v f v < f u ( 1 − p u , v ) f_u=\frac{\sum_{v}^{f_v<f_u}p_{u, v}f_v\prod _{k}^{f_k<f_v}(1-p_{u, k})+1}{1-\prod_{v}^{f_v<f_u}(1-p_{u, v})}
f u = 1 − ∏ v f v < f u ( 1 − p u , v ) ∑ v f v < f u p u , v f v ∏ k f k < f v ( 1 − p u , k ) + 1
这就是我们要的转移式子。
我们再考虑如何更新。我们可以发现一个点如果考虑的点越多,它的 f f f 是不增的,同时不可能会用更大的 f f f 来更新它。换句话说就是如果一个点的 f f f 是全局最小,那么就没有别的点会更新它,也就是它的 f f f 值已经固定了。我们就可以用类似 dijkstra 的思路来更新了。
时间复杂度 O ( n 2 ) O(n^2) O ( n 2 ) 。
Rainbow Balls
有一袋球,有 n n n 种颜色,其中第 i i i 个颜色的球有 a i a_i a i 个。
当袋子里至少有两个不同颜色的球时,执行以下步骤:
一个接一个的按照顺序随机取出两个的球,这些球的颜色可能是一样的。
把第二个球涂成第一个球的颜色,然后把两个球放回袋子里。
所有这些动作只需要一秒钟。输出无法操作时候的期望时间
数据范围:n ≤ 2500 , 1 ≤ a i ≤ 1 0 5 n\le 2500,1\le a_i \le 10^5 n ≤ 2 5 0 0 , 1 ≤ a i ≤ 1 0 5 。
设 s = ∑ a i s=\sum a_i s = ∑ a i 。我们先设一个目标颜色 x x x ,也就是我们最终要的颜色全部相同的颜色。我们再设 f i f_i f i 为当前有 i i i 个目标颜色,到最终全部是 x x x 的期望时间。最终答案就是 ∑ f a i \sum f_{a_i} ∑ f a i
我们考虑转移。我们先设 p p p 为从盒子中选出两个球,其中第一个是 x x x ,第二个不是 x x x 的概率,显然 p = i ( s − i ) s ( s − 1 ) p=\frac{i(s-i)}{s(s-1)} p = s ( s − 1 ) i ( s − i ) 。那么我们转移就能写出来为:
f i = ( f i + 1 + f i − 1 ) p + ( 1 − 2 p ) f i + 1 f_i=(f_{i+1}+f_{i-1})p+(1-2p)f_i+\color{red}1
f i = ( f i + 1 + f i − 1 ) p + ( 1 − 2 p ) f i + 1
但是我们发现这样转移是错误的,因为我们转移时不能保证它不到达 f 0 f_0 f 0 这个情况,这时 f 0 f_0 f 0 不存在。因此我们转移时加上的应该是它能不经过 f 0 f_0 f 0 走到 f s f_s f s 的概率,我们记作 v v v 。
如何求出 v v v 呢,我们可以设 g i g_i g i 为有 i i i 个 x x x 时 x x x 留到最后的概率,那么我们可以写出转移:
g i = g i − 1 p + g i + 1 p + ( 1 − 2 p ) g i g_i=g_{i-1}p+g_{i+1}p+(1-2p)g_i
g i = g i − 1 p + g i + 1 p + ( 1 − 2 p ) g i
我们可以得出这么一个结论:g i + 1 − g i = g i − g i − 1 g_{i+1}-g_{i}=g_i-g_{i-1} g i + 1 − g i = g i − g i − 1 。而初始状态为:g 0 = 0 , g s = 1 g_0=0, g_s=1 g 0 = 0 , g s = 1 。那么我们就可以得到 v = g i = i s v=g_i=\frac{i}{s} v = g i = s i 。
我们带回原式即可得到:
f i = ( f i + 1 + f i − 1 ) p + ( 1 − 2 p ) f i + i s 2 p f i = ( f i + 1 + f i − 1 ) p + i s 2 f i = f i + 1 + f i − 1 + i s × i ( s − i ) s ( s − 1 ) 2 f i = f i + 1 + f i − 1 + s − 1 s − i f i + 1 = 2 f i − f i − 1 − s − 1 s − i \begin{aligned}
f_i&=(f_{i+1}+f_{i-1})p+(1-2p)f_i+\frac{i}{s}\\
2pf_i&=(f_{i+1}+f_{i-1})p+\frac{i}{s}\\
2f_i&=f_{i+1}+f_{i-1}+\frac{i}{s\times \frac{i(s-i)}{s(s-1)}}\\
2f_i&=f_{i+1}+f_{i-1}+\frac{s-1}{s-i}\\
f_{i+1}&=2f_i-f_{i-1}-\frac{s-1}{s-i}
\end{aligned}
f i 2 p f i 2 f i 2 f i f i + 1 = ( f i + 1 + f i − 1 ) p + ( 1 − 2 p ) f i + s i = ( f i + 1 + f i − 1 ) p + s i = f i + 1 + f i − 1 + s × s ( s − 1 ) i ( s − i ) i = f i + 1 + f i − 1 + s − i s − 1 = 2 f i − f i − 1 − s − i s − 1
我们就得到了递推的公式,但是现在 f 1 f_1 f 1 和 f 2 f_2 f 2 未知,无法计算。我们考虑求出这俩玩意。
首先当 i = 0 i=0 i = 0 时 f 0 f_0 f 0 不存在,因此 f 2 = 2 f 1 − 1 f_2=2f_1-1 f 2 = 2 f 1 − 1 。我们再设 g i = f i + 1 − f i g_i=f_{i+1}-f_i g i = f i + 1 − f i ,根据上面我们推导的式子 f i + 1 − f i = f i − f i − 1 − s − 1 s − i f_{i+1}-f_{i}=f_i-f_{i-1}-\frac{s-1}{s-i} f i + 1 − f i = f i − f i − 1 − s − i s − 1 ,我们就能得到 g i = g i − 1 − s − 1 s − i g_i=g_{i-1}-\frac{s-1}{s-i} g i = g i − 1 − s − i s − 1 ,特殊情况即为 g 0 = f 1 g_0=f_1 g 0 = f 1 ,因此 g i = f 1 − ∑ j = 1 i s − 1 s − j g_i=f_1-\sum\limits_{j=1}^i\frac{s-1}{s-j} g i = f 1 − j = 1 ∑ i s − j s − 1 。
我们又知道 f s = 0 f_s=0 f s = 0 ,同时 f s = f 1 + ∑ i = 1 n − 1 g i f_s=f_1+\sum\limits_{i=1}^{n-1}g_i f s = f 1 + i = 1 ∑ n − 1 g i 。我们再推下式子:
0 = f 1 + ∑ i = 1 s − 1 g i = f 1 + ∑ i = 1 s − 1 ( f 1 − ∑ j = 1 i s − 1 s − j ) = s f 1 − ∑ i = 1 s − 1 ∑ j = 1 i s − 1 s − j = s f 1 − ∑ j = 1 s − 1 ∑ i = j s − 1 s − 1 s − j = s f 1 − ∑ j = 1 s − 1 s − 1 s − j ( s − j ) = s f 1 − ( s − 1 ) 2 \begin{aligned}
0&=f_1+\sum_{i=1}^{s-1}g_i\\
&=f_1+\sum_{i=1}^{s-1}(f_1-\sum_{j=1}^i \frac{s-1}{s-j})\\
&=sf_1-\sum\limits_{i=1}^{s-1}\sum_{j=1}^i\frac{s-1}{s-j}\\
&=sf_1-\sum_{j=1}^{s-1}\sum_{i=j}^{s-1}\frac{s-1}{s-j}\\
&=sf_1-\sum_{j=1}^{s-1}\frac{s-1}{s-j}(s-j)\\
&=sf_1-(s-1)^2
\end{aligned}
0 = f 1 + i = 1 ∑ s − 1 g i = f 1 + i = 1 ∑ s − 1 ( f 1 − j = 1 ∑ i s − j s − 1 ) = s f 1 − i = 1 ∑ s − 1 j = 1 ∑ i s − j s − 1 = s f 1 − j = 1 ∑ s − 1 i = j ∑ s − 1 s − j s − 1 = s f 1 − j = 1 ∑ s − 1 s − j s − 1 ( s − j ) = s f 1 − ( s − 1 ) 2
解得 f 1 = ( s − 1 ) 2 s f_1=\frac{(s-1)^2}{s} f 1 = s ( s − 1 ) 2 。再根据 f 2 = 2 f 1 − 1 f_2=2f_1-1 f 2 = 2 f 1 − 1 就可以递推了。
时间复杂度 O ( max ( a i ) ) O(\max(a_i)) O ( max ( a i ) ) 。
Student’s Camp
有一个 ( n + 2 ) × m (n+2) \times m ( n + 2 ) × m 的网格。除了第一行和最后一行,其他每一行每一天最左边和最右边的格子都有 p p p 的概率消失。求 k k k 天后,网格始终保持连通的概率。
数据范围:n , m ≤ 1.5 × 1 0 3 n,m \le 1.5 \times 10^3 n , m ≤ 1 . 5 × 1 0 3 ,k ≤ 1 0 5 k \le 10^5 k ≤ 1 0 5 。
我们设 D ( i ) D(i) D ( i ) 为这 k k k 天从一边消失恰好 i i i 个格子的概率,显然 D ( i ) = ( k i ) p i ( 1 − p ) k − i D(i)=\dbinom{k}{i}p^i(1-p)^{k-i} D ( i ) = ( i k ) p i ( 1 − p ) k − i 。我们再设 P ( l , r ) P(l, r) P ( l , r ) 为 k k k 天后一行网格中恰好 [ l , r ] [l, r] [ l , r ] 这段区间保持连通的概率,那么由于左右两边是相互独立的,就有 P ( l , r ) = D ( l − 1 ) D ( m − r ) P(l,r)=D(l-1)D(m-r) P ( l , r ) = D ( l − 1 ) D ( m − r ) 。
我们设 f [ i , l , r ] f[i, l, r] f [ i , l , r ] 为第 i i i 行 [ l , r ] [l,r] [ l , r ] 没有消失,且和前 i − 1 i-1 i − 1 行保持连通的概率,那么比较显然的转移是进行一个区间 dp,上一行的区间只要和这一行有交即可。但是这样转移的复杂度是 O ( n m 4 ) O(nm^4) O ( n m 4 ) 的,我们考虑用容斥优化一下。
我们发现要减去的情况只有 r ′ < l r'<l r ′ < l 和 r < l ′ r<l' r < l ′ 这两种情况,于是我们就可以写出转移:
f [ i , l , r ] = P ( l , r ) ( ∑ l ′ ≤ r ′ f [ i − 1 , l ′ , r ′ ] − ∑ r ′ < l f [ i − 1 , l ′ , r ′ ] − ∑ l ′ > r f [ i − 1 , l ′ , r ′ ] ) f[i, l, r]=P(l, r)\left(\sum\limits_{l'\le r'}f[i-1,l',r']-\sum\limits_{r'<l}f[i-1, l', r']-\sum\limits_{l'>r}f[i-1, l', r'] \right)
f [ i , l , r ] = P ( l , r ) ( l ′ ≤ r ′ ∑ f [ i − 1 , l ′ , r ′ ] − r ′ < l ∑ f [ i − 1 , l ′ , r ′ ] − l ′ > r ∑ f [ i − 1 , l ′ , r ′ ] )
我们把这三个 ∑ \sum ∑ 都表示出来:
F i = ∑ l ′ ≤ r ′ f [ i , l ′ , r ′ ] F_i=\sum\limits_{l'\le r'}f[i,l',r']
F i = l ′ ≤ r ′ ∑ f [ i , l ′ , r ′ ]
L [ i , x ] = ∑ l ≤ r < x f [ i , l , r ] L[i, x]=\sum\limits_{l\le r <x} f[i, l, r]
L [ i , x ] = l ≤ r < x ∑ f [ i , l , r ]
R [ i , x ] = ∑ x < l ≤ r f [ i , l , r ] R[i, x]=\sum \limits_{x<l\le r} f[i, l, r]
R [ i , x ] = x < l ≤ r ∑ f [ i , l , r ]
那么 f f f 的转移式就能写成:f [ i , l , r ] = P ( l , r ) ( F i − 1 − L [ i − 1 , l ] − R [ i − 1 , r ] ) f[i, l, r]=P(l, r)(F_{i-1}-L[i - 1, l]-R[i - 1, r]) f [ i , l , r ] = P ( l , r ) ( F i − 1 − L [ i − 1 , l ] − R [ i − 1 , r ] ) 。而且最终我们的答案也就是 F n F_n F n 。
首先我们可以发现 L L L 和 R R R 其实是完全对称的,因此 L [ i , x ] = R [ i , m − x ] L[i, x]=R[i, m-x] L [ i , x ] = R [ i , m − x ] 。
我们再设 S [ i , r ] = ∑ l ≤ r f [ i , l , r ] S[i, r]=\sum\limits_{l\le r}f[i, l, r] S [ i , r ] = l ≤ r ∑ f [ i , l , r ] ,也就是所有右端点在 r r r 的 f f f 之和。我们发现对 S S S 做一遍前缀和就能得到 L L L ,那么我们只用考虑求出 S S S 了。我们把 f f f 的转移方程带入到计算 S S S 的式子里面:
S [ i , r ] = ∑ l ≤ r f [ i , l , r ] = ∑ l ≤ r P ( l , r ) ( F i − 1 − L [ i − 1 , l ] − R [ i − 1 , r ] ) = D ( m − r ) ∑ l ≤ r D ( l − 1 ) ( F i − 1 − L [ i − 1 , l ] − R [ i − 1 , r ] ) = D ( m − r ) ( ( F i − 1 − R [ i − 1 , r ] ) ∑ l ≤ r D ( l − 1 ) − ∑ l ≤ r D ( l − 1 ) L [ i − 1 , l ] ) \begin{aligned}
S[i, r]&=\sum\limits_{l\le r}f[i,l, r]\\
&=\sum\limits_{l\le r}P(l, r)(F_{i-1}-L[i - 1, l]-R[i - 1, r])\\
&=D(m-r)\sum_{l\le r} D(l-1)(F_{i-1}-L[i-1, l]-R[i-1, r])\\
&=D(m-r)\left((F_{i-1} - R[i-1, r])\sum_{l\le r}D(l-1)-\sum_{l\le r}D(l-1)L[i-1,l]\right)
\end{aligned}
S [ i , r ] = l ≤ r ∑ f [ i , l , r ] = l ≤ r ∑ P ( l , r ) ( F i − 1 − L [ i − 1 , l ] − R [ i − 1 , r ] ) = D ( m − r ) l ≤ r ∑ D ( l − 1 ) ( F i − 1 − L [ i − 1 , l ] − R [ i − 1 , r ] ) = D ( m − r ) ( ( F i − 1 − R [ i − 1 , r ] ) l ≤ r ∑ D ( l − 1 ) − l ≤ r ∑ D ( l − 1 ) L [ i − 1 , l ] )
到了这里就比较清楚了,我们可以直接对 D D D 和 D ( l − 1 ) L [ i − 1 , l ] D(l-1)L[i-1, l] D ( l − 1 ) L [ i − 1 , l ] 做前缀和,转移就可以做到 O ( 1 ) O(1) O ( 1 ) 。而要求 F i F_i F i 也直接对 L [ i ] L[i] L [ i ] 做一遍前缀和即可。
时间复杂度 O ( n m ) O(nm) O ( n m ) 。
小 Y 和恐怖的奴隶主
Boss 有 1 0 100 10^{100} 1 0 1 0 0 点生命值,它只带了一个随从——一个只有 m m m 点生命值的“恐怖的奴隶主”。
这个“恐怖的奴隶主”有一个特殊的技能:每当它被扣减生命值但没有死亡(死亡即生命值 ≤ 0 \leq 0 ≤ 0 ),且 Boss 的随从数量小于上限 k k k ,便会召唤一个新的具有 m m m 点生命值的“恐怖的奴隶主”。
现在进行 n n n 次攻击,每次攻击时,会从 Boss 以及 Boss 的所有随从中的等概率随机选择一个,并扣减 1 1 1 点生命值,求出进行 n n n 次攻击后扣减 Boss 的生命值点数的期望。
数据范围:1 ≤ T ≤ 1000 , 1 ≤ n ≤ 10 18 , 1 ≤ m ≤ 3 , 1 ≤ k ≤ 8 1 \leq T \leq 1000, 1 \leq n \leq {10}^{18}, 1 \leq m \leq 3, 1 \leq k \leq 8 1 ≤ T ≤ 1 0 0 0 , 1 ≤ n ≤ 1 0 1 8 , 1 ≤ m ≤ 3 , 1 ≤ k ≤ 8 。
我们发现 k k k 和 m m m 很小,稍微权衡一下就能得到状态设计:f [ i , a , b , c ] f[i, a, b, c] f [ i , a , b , c ] 为前 i i i 次攻击,当前有 a a a 个 1 1 1 血量的随从,b b b 个 2 2 2 血量的随从,c c c 个 3 3 3 血量的随从的概率。
我们可以发现这样只有 166 166 1 6 6 个状态,允许我们加速递推。
我们很容易就能得到转移方程(下面只用 m = 3 m=3 m = 3 来举例):
设 a d d = [ a + b + c ≠ k ] add=[a+b+c\not=k] a d d = [ a + b + c = k ] ,则有:
f i + 1 , a − 1 , b , c ← a a + b + c + 1 f i , a , b , c ( a > 0 ) f_{i+1, a-1, b, c}\leftarrow \frac{a}{a+b+c+1} f_{i, a, b, c}(a>0)
f i + 1 , a − 1 , b , c ← a + b + c + 1 a f i , a , b , c ( a > 0 )
f i + 1 , a + 1 , b − 1 , c + a d d ← b a + b + c + 1 f i , a , b , c ( b > 0 ) f_{i+1, a+1, b-1, c+add}\leftarrow \frac{b}{a+b+c+1} f_{i, a, b, c}(b>0)
f i + 1 , a + 1 , b − 1 , c + a d d ← a + b + c + 1 b f i , a , b , c ( b > 0 )
f i + 1 , a , b + 1 , c − 1 + a d d ← c a + b + c + 1 f i , a , b , c ( c > 0 ) f_{i+1, a, b+1, c-1+add}\leftarrow \frac{c}{a+b+c+1} f_{i, a, b, c}(c>0)
f i + 1 , a , b + 1 , c − 1 + a d d ← a + b + c + 1 c f i , a , b , c ( c > 0 )
f i + 1 , a , b , c ← 1 a + b + c + 1 f i , a , b , c f_{i+1, a, b, c}\leftarrow \frac{1}{a+b+c+1} f_{i, a, b, c}
f i + 1 , a , b , c ← a + b + c + 1 1 f i , a , b , c
而对于伤害的期望,我们可以在转移时记录一个 g i g_i g i ,表示第 i i i 次攻击时期望伤害,让所有 f i , a , b , c f_{i, a, b, c} f i , a , b , c 以 1 a + b + c + 1 \frac{1}{a+b+c+1} a + b + c + 1 1 的系数转移过来即可。
我们可以直接预处理递推矩阵的 2 k 2^k 2 k 次幂,然后每次询问 O ( 16 6 2 log n ) O(166^2\log n) O ( 1 6 6 2 log n ) 即可。
时间复杂度 O ( 16 6 3 log n + T 16 6 2 log n ) O(166^3\log n+T166^2\log n) O ( 1 6 6 3 log n + T 1 6 6 2 log n ) 。
斗主地
一副牌一共有 n n n 张牌,从上到下依次标号为 1 − n 1 - n 1 − n 。标号为 i i i 的牌分数是 f ( i ) f(i) f ( i ) 。在 本题,f ( i ) f(i) f ( i ) 有且仅有两种可能:f ( i ) = i f(i) = i f ( i ) = i 或 f ( i ) = i 2 f(i) = i^2 f ( i ) = i 2 。
洗牌环节一共分 m m m 轮,这 m m m 轮洗牌依次进行。第 i i i 轮洗牌时:
拿出从最上面往下数的前 A i A_i A i 张牌。这样这副牌就被分成了两堆:第一堆是最上面的 A i A_i A i 张牌,第二堆是剩下的 n − A i n-A_i n − A i 张牌,且这两堆牌内相对顺序不变。 特别地,当A i = n A_i = n A i = n 或 A i = 0 A_i = 0 A i = 0 时,有一堆牌是空的。
接下来对两堆牌进行合并,从而产生新的第三堆牌。当第一堆牌还剩下 X X X 张,第二堆牌还剩下 Y Y Y 张的时候,以 X X + Y \dfrac{X}{X+Y} X + Y X 的概率取出第一堆牌的最下面的牌,并将它 放入新的第三堆牌的最上面, Y X + Y \dfrac{Y}{X+Y} X + Y Y 的概率取出第二堆牌的最下面的牌,并将它放 入新的第三堆牌的最上面
重复操作 2 2 2 ,一直取到两堆牌都为空为止。这样我们就完成了一轮洗牌。
因为洗牌过程是随机的,所以小 S S S 发现自己没法知道某个位置上具体是哪张牌。但 crimson000 想问你在经历了这 m m m 轮洗牌后,某个位置上的牌的期望分数 是多少。一共有 Q Q Q 个这样的问题。
数据范围:3 ≤ n ≤ 1 0 7 3\le n \le 10^7 3 ≤ n ≤ 1 0 7 ,1 ≤ m , Q ≤ 5 × 1 0 5 1\le m,Q\le5\times 10^5 1 ≤ m , Q ≤ 5 × 1 0 5 ,0 ≤ A i ≤ n 0\le A_i\le n 0 ≤ A i ≤ n ,t y p e ∈ { 1 , 2 } type\in \{1,2\} t y p e ∈ { 1 , 2 } 。
我们先来证明一个结论:经过一轮洗牌后,可能出现的序列的出现概率相同。
我们可以把第一堆的牌看作 0 0 0 ,第二堆牌看作 1 1 1 ,而对于题目中的洗牌方式我们可以看作从剩下的所有 0 0 0 和 1 1 1 中选出一个数放到序列最后。我们考虑给每个点附一个编号,那么这 n ! n! n ! 种排列的出现概率都是相同的。而每一个 01 01 0 1 序列去附编号的方案数都是 A ( n − A ) A(n-A) A ( n − A ) ,因此所有序列的出现概率都是相同的。
有了这个结论我们就可以去 dp 了。我们设 f i , j , k f_{i, j, k} f i , j , k 为 i i i 轮洗牌后第 j j j 个位置的牌跑到第 k k k 个位置的概率,我们枚举这一轮中这个牌在哪,再根据我们上面的结论就可以得到下面的转移:
f i , j , k = ∑ l = 1 A i ( k − 1 l − 1 ) ( n − k A i − l ) ( n A i ) f i − 1 , j , l + ∑ l = A i + 1 n ( k − 1 l − A i − 1 ) ( n − k n − l ) ( n A i ) f i − 1 , j , l f_{i, j, k}=\sum_{l=1}^{A_i}\frac{\dbinom{k-1}{l-1}\dbinom{n-k}{A_i-l}}{\dbinom{n}{A_i}}f_{i-1, j, l}+\sum_{l=A_i+1}^{n}\frac{\dbinom{k-1}{l-A_i-1}\dbinom{n-k}{n-l}}{\dbinom{n}{A_i}}f_{i-1, j, l}
f i , j , k = l = 1 ∑ A i ( A i n ) ( l − 1 k − 1 ) ( A i − l n − k ) f i − 1 , j , l + l = A i + 1 ∑ n ( A i n ) ( l − A i − 1 k − 1 ) ( n − l n − k ) f i − 1 , j , l
其中 ( k − 1 l − 1 ) ( n − k A i − l ) \dbinom{k-1}{l-1}\dbinom{n-k}{A_i-l} ( l − 1 k − 1 ) ( A i − l n − k ) 和 ( k − 1 l − A i − 1 ) ( n − k n − l ) \dbinom{k-1}{l-A_i-1}\dbinom{n-k}{n-l} ( l − A i − 1 k − 1 ) ( n − l n − k ) 的意思是看这个牌和它同一堆的,在它前面的放哪,在它后面的放哪。
这样的时间复杂度是 O ( m n 3 ) O(mn^3) O ( m n 3 ) 的。我们考虑直接设期望。
我们设 f i , j f_{i, j} f i , j 为第 i i i 次打乱后第 j j j 个位置的期望分数,那么我们可以把上面的转移照搬下来:
f i , j = ∑ l = 1 A i ( j − 1 l − 1 ) ( n − j A i − l ) ( n A i ) f i − 1 , l + ∑ l = A i + 1 n ( j − 1 l − A i − 1 ) ( n − j n − l ) ( n A i ) f i − 1 , l f_{i, j}=\sum_{l=1}^{A_i}\frac{\dbinom{j-1}{l-1}\dbinom{n-j}{A_i-l}}{\dbinom{n}{A_i}}f_{i-1, l}+\sum_{l=A_i+1}^{n}\frac{\dbinom{j-1}{l-A_i-1}\dbinom{n-j}{n-l}}{\dbinom{n}{A_i}}f_{i-1, l}
f i , j = l = 1 ∑ A i ( A i n ) ( l − 1 j − 1 ) ( A i − l n − j ) f i − 1 , l + l = A i + 1 ∑ n ( A i n ) ( l − A i − 1 j − 1 ) ( n − l n − j ) f i − 1 , l
时间复杂度 O ( m n 2 ) O(mn^2) O ( m n 2 ) 。我们考虑暴力求出来 t = 1 , i = 1 t=1, i=1 t = 1 , i = 1 时的 f f f 值:
f 1 , x = ∑ j = 1 A 1 ( x − 1 j − 1 ) ( n − x A 1 − j ) ( n A 1 ) × j + ∑ l = A 1 + 1 n ( x − 1 j − A 1 − 1 ) ( n − x n − j ) ( n A 1 ) × j \begin{aligned}
f_{1, x}&=\sum_{j=1}^{A_1}\frac{\dbinom{x-1}{j-1}\dbinom{n-x}{A_1-j}}{\dbinom{n}{A_1}}\times j+\sum_{l=A_1+1}^{n}\frac{\dbinom{x-1}{j-A_1-1}\dbinom{n-x}{n-j}}{\dbinom{n}{A_1}}\times j\\
\end{aligned}
f 1 , x = j = 1 ∑ A 1 ( A 1 n ) ( j − 1 x − 1 ) ( A 1 − j n − x ) × j + l = A 1 + 1 ∑ n ( A 1 n ) ( j − A 1 − 1 x − 1 ) ( n − j n − x ) × j
我们发现左右两边长得差不多,我们只单独弄出来左半边来。
∑ j = 1 A 1 ( x − 1 j − 1 ) ( n − x A 1 − j ) ( n A 1 ) × j = ∑ j = 1 A 1 ( x − 1 j − 1 ) ( n − x A 1 − j ) ( n A 1 ) × ( j − 1 ) + ∑ j = 1 A 1 ( x − 1 j − 1 ) ( n − x A 1 − j ) ( n A 1 ) = ∑ j = 1 A 1 ( x − 2 j − 2 ) ( n − x A 1 − j ) ( n A 1 ) × ( x − 1 ) + ( n − 1 A 1 − 1 ) ( n A 1 ) = ( x − 2 A 1 − 2 ) ( n A 1 ) × ( x − 1 ) + ( n − 1 A 1 − 1 ) ( n A 1 ) \begin{aligned}
\sum_{j=1}^{A_1}\frac{\dbinom{x-1}{j-1}\dbinom{n-x}{A_1-j}}{\dbinom{n}{A_1}}\times j&=\sum_{j=1}^{A_1}\frac{\dbinom{x-1}{j-1}\dbinom{n-x}{A_1-j}}{\dbinom{n}{A_1}}\times (j-1)+\sum_{j=1}^{A_1}\frac{\dbinom{x-1}{j-1}\dbinom{n-x}{A_1-j}}{\dbinom{n}{A_1}}\\
&=\sum_{j=1}^{A_1}\frac{\dbinom{x-2}{j-2}\dbinom{n-x}{A_1-j}}{\dbinom{n}{A_1}}\times (x-1)+\frac{\dbinom{n-1}{A_1-1}}{\dbinom{n}{A_1}}\\
&=\frac{\dbinom{x-2}{A_1-2}}{\dbinom{n}{A_1}}\times (x-1)+\frac{\dbinom{n-1}{A_1-1}}{\dbinom{n}{A_1}}\\
\end{aligned}
j = 1 ∑ A 1 ( A 1 n ) ( j − 1 x − 1 ) ( A 1 − j n − x ) × j = j = 1 ∑ A 1 ( A 1 n ) ( j − 1 x − 1 ) ( A 1 − j n − x ) × ( j − 1 ) + j = 1 ∑ A 1 ( A 1 n ) ( j − 1 x − 1 ) ( A 1 − j n − x ) = j = 1 ∑ A 1 ( A 1 n ) ( j − 2 x − 2 ) ( A 1 − j n − x ) × ( x − 1 ) + ( A 1 n ) ( A 1 − 1 n − 1 ) = ( A 1 n ) ( A 1 − 2 x − 2 ) × ( x − 1 ) + ( A 1 n ) ( A 1 − 1 n − 1 )
我们发现最终的式子只和 x x x 线性相关,那么我们可以把 k x + b kx+b k x + b 再带入 f 2 f_2 f 2 中,我们依旧能得到相同的结论。因此我们就能证明 f m ( x ) f_m(x) f m ( x ) 为关于 x x x 的一次函数。
而对于 t = 2 t=2 t = 2 ,我们可以把二次式化为 a ( x − 1 ) ( x − 2 ) + b ( x − 1 ) + c a(x-1)(x-2)+b(x-1)+c a ( x − 1 ) ( x − 2 ) + b ( x − 1 ) + c ,然后和上面一样推式子,我们可以证明它依旧是一个二次函数。我们就可以递推出 f m f_m f m 的系数,每次询问 O ( 1 ) O(1) O ( 1 ) 回答即可。
时间复杂度 O ( n + m + k ) O(n+m+k) O ( n + m + k ) 。
[ZJOI2017] 树状数组
漆黑的晚上,crimson001 躺在床上辗转反侧。难以入眠的她想起了若干年前她的一次悲惨的 OI 比赛经历。那是一道基础的树状数组题。
给出一个长度为 n n n 的数组 A A A ,初始值都为 0 0 0 ,接下来进行 m m m 次操作,操作有两种:
1 x 1\ x 1 x ,表示将 A x A_x A x 变成 ( A x + 1 ) m o d 2 (A_x + 1) \bmod 2 ( A x + 1 ) m o d 2 。
2 l r 2\ l\ r 2 l r ,表示询问 ( ∑ i = l r A i ) m o d 2 (\sum_{i=l}^r A_i) \bmod 2 ( ∑ i = l r A i ) m o d 2 。
尽管那个时候的 crimson001 非常的 simple,但是她还是发现这题可以用树状数组做。当时非常 young 的她写了如下的算法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 void add (int x, int v) { for (; x; x -= lowbit (x)) c[x] = (c[x] + 1 ) % 2 ; } int find (int x) { if (x == 0 ) return 0 ; int ans = 0 ; for (; x <= n; x += lowbit (x)) ans = (ans + c[x]) % 2 ; return ans; } int Query (int l, int r) { int ansl = find (l - 1 ); int ansr = find (r); return (ansr - ansl + 2 ) % 2 ; }
如果你对树状数组比较熟悉,不难发现可怜把树状数组写错了:Add \text{Add} Add 和 Find \text{Find} Find 中 x x x 变化的方向反了。因此这个程序在最终测试时华丽的爆 0 了。
然而奇怪的是,在当时,这个程序通过了出题人给出的大样例——这也是 crimson001 没有进行对拍的原因。
现在,crimson001 想要算一下,这个程序回答对每一个询问的概率是多少,这样她就可以再次的感受到自己是一个多么非的人了。然而时间已经过去了很多年,即使是 crimson001 也没有办法完全回忆起当时的大样例。幸运的是,她回忆起了大部分内容,唯一遗忘的是每一次第一类操作的 x x x 的值,因此她假定这次操作的 x x x 是在 [ l i , r i ] [l_i, r_i] [ l i , r i ] 范围内等概率随机 的。
具体来说,crimson001 给出了一个长度为 n n n 的数组 A A A ,初始为 0 0 0 ,接下来进行了 m m m 次操作:
1 l r 1\ l\ r 1 l r ,表示在区间 [ l , r ] [l, r] [ l , r ] 中等概率选取一个 x x x 并执行 Add ( x ) \text{Add}(x) Add ( x ) 。
2 l r 2\ l\ r 2 l r ,表示询问执行 Query ( l , r ) \text{Query}(l, r) Query ( l , r ) 得到的结果是正确的概率是多少。
数据范围:n , m ≤ 1 0 5 n, m\le 10^5 n , m ≤ 1 0 5 。
我们转化完题意就能发现,我们要求的其实就是 a l − 1 = a r a_{l-1}=a_r a l − 1 = a r 的概率。我们设 p x , y p_{x, y} p x , y 为 a x = a y a_x=a_y a x = a y 的概率,进行一个分类讨论。
当 x < l , l ≤ y ≤ r x<l,l\le y\le r x < l , l ≤ y ≤ r 时,a x a_x a x 和 a y a_y a y 相同情况变化的概率为 1 r − l + 1 \frac{1}{r-l+1} r − l + 1 1 。
当 l ≤ x ≤ r , r < y l\le x\le r, r<y l ≤ x ≤ r , r < y 时,变化的概率为 1 r − l + 1 \frac{1}{r-l+1} r − l + 1 1 。
当 l ≤ x < y ≤ r l\le x<y\le r l ≤ x < y ≤ r 时,变化的概率为 2 r − l + 1 \frac{2}{r-l+1} r − l + 1 2 。
这里还有一个特殊情况为 l = 1 l=1 l = 1 时,这次这一次询问答案不变就等价于 s u m 1 ∼ r = s u m r ∼ n sum_{1\sim r}=sum_{r\sim n} s u m 1 ∼ r = s u m r ∼ n 。那么再对这种情况分类讨论:
当 x = 1 , l ≤ y ≤ r x=1, l\le y\le r x = 1 , l ≤ y ≤ r 时,变化的概率为 r − l r − l + 1 \frac{r-l}{r-l+1} r − l + 1 r − l 。
当 y < l y<l y < l 或 y > r y>r y > r 时,变化的概率是 1 1 1 。
于是我们可以用树套树来维护。设当前操作不变的概率为 q q q ,原先相等的概率为 p p p ,那么新的相等的概率为 p q + ( 1 − p ) ( 1 − q ) pq+(1-p)(1-q) p q + ( 1 − p ) ( 1 − q ) 。树套树标记永久化一下即可。
时间复杂度 O ( n log 2 n ) O(n\log ^2n) O ( n log 2 n ) 。
Sonya and Informatics
给一个长度为 n n n 的 01 01 0 1 串,进行 k k k 次操作,每次操作选择两个位置 i , j i,j i , j ,交换 i , j i,j i , j 上的数,求 k k k 次操作后,该 01 01 0 1 串变成非降序列的概率。
数据范围:n ≤ 100 , k ≤ 1 0 9 n\le 100,k\le 10^9 n ≤ 1 0 0 , k ≤ 1 0 9 。
我们求出变为非降序列的方案数,最后除以 ( n ( n − 1 ) 2 ) k \left(\frac{n(n-1)}{2} \right)^k ( 2 n ( n − 1 ) ) k 即为概率。假设序列中有 m m m 个 0 0 0 ,那么最终的序列前面一定是有 m m m 个 0 0 0 的,我们就用这一点来表示当前的状态。
我们设 f i , j f_{i, j} f i , j 为 i i i 次操作,前 m m m 个位置里有 j j j 个 0 0 0 的方案数。转移我们就考虑如何让前面的 0 0 0 跑到后面或者让后面的 0 0 0 跑到前面即可。转移如下:
f i + 1 , j + 1 ← ( m − j ) 2 f i , j f_{i+1, j+1}\leftarrow (m-j)^2f_{i, j}
f i + 1 , j + 1 ← ( m − j ) 2 f i , j
f i + 1 , j − 1 ← j × ( n − 2 m + j ) f i , j f_{i+1, j-1}\leftarrow j\times (n-2m+j)f_{i, j}
f i + 1 , j − 1 ← j × ( n − 2 m + j ) f i , j
f i + 1 , j ← ( n 2 − ( m − j ) 2 − j × ( n − 2 m + j ) ) × f i , j f_{i+1,j}\leftarrow (\frac{n}{2}-(m-j)^2-j\times (n-2m+j))\times f_{i, j}
f i + 1 , j ← ( 2 n − ( m − j ) 2 − j × ( n − 2 m + j ) ) × f i , j
我们可以矩阵加速递推。时间复杂度 O ( n 3 log k ) O(n^3\log k) O ( n 3 log k ) 。
Boring Problem(gym103119B)
定义 F ( S , T , p ) F(S, T, p) F ( S , T , p ) 为:给定一个长度为 ∣ S ∣ |S| ∣ S ∣ 的字符串 S S S 和 n n n 个长度为 m m m 的字符串 T i T_i T i ,字符集大小为 k k k ,每次向 S S S 后以 p i p_i p i 的概率添加一个字符 i i i 。直到存在 T j T_j T j 为 S S S 的子序列时停止,这时 S S S 的期望长度。
现在给定你 T i T_i T i 和一个字符串 R R R 以及添加字符的概率 p p p ,对于 R R R 的每一个前缀(长度为 i i i 的前缀记为 R i R_i R i ),求出 F ( R i , T , p ) F(R_i, T, p) F ( R i , T , p ) 。
数据范围:n ≤ 100 , n × m ≤ 1 0 4 , k ≤ 26 , ∣ R ∣ ≤ 1 0 4 n\le 100, n\times m\le 10^4, k\le 26, |R|\le 10^4 n ≤ 1 0 0 , n × m ≤ 1 0 4 , k ≤ 2 6 , ∣ R ∣ ≤ 1 0 4 。
这种往后填字符一般有两种做法:PGF 和直接期望 dp。这里我们进行一个期望 dp,因为题目中是要对所有 R R R 的前缀都求一遍,我们只需要在 AC 自动机上跑前缀即可。
我们先建出来 AC 自动机,设 E i E_i E i 为 AC 自动机上编号为 i i i 的点到一个终止状态的期望步数。转移显然,我们设 t r i , c tr_{i, c} t r i , c 为 i i i 点的第 c c c 个儿子,那么转移为:
E u = ∑ c = 1 k p c × E t r u , c + 1 E_u=\sum_{c=1}^{k} p_c\times E_{tr_{u, c}} + 1
E u = c = 1 ∑ k p c × E t r u , c + 1
我们发现这样是有后效性的,要高斯消元,时间复杂度 O ( ( n m ) 3 ) O((nm)^3) O ( ( n m ) 3 ) ,显然过不去。
设 x x x 的第 c c c 个儿子是 y y y (且这条转移存在),我们进行一个移项:
E y = 1 p c ( E x − ∑ c ′ ≠ c p c ′ × E t r x , c ′ − 1 ) E_y=\frac{1}{p_c}\left(E_x-\sum_{c'\not= c}p_{c'}\times E_{tr_{x, c'}}-1 \right)
E y = p c 1 ⎝ ⎛ E x − c ′ = c ∑ p c ′ × E t r x , c ′ − 1 ⎠ ⎞
我们发现 y y y 的期望只和它的父亲以及它的兄弟相关,考虑缩减未知数数量。我们选取 x x x 的任意一个儿子 y y y ,让剩下的儿子成为未知数,那么如果我们用这些未知数表示出了深度小于 d d d 的点,那么对于某个深度等于 d d d 的点一定可以用自己表示(新开一个未知数)或者用它的兄弟以及深度小于 d d d 的点来表示。这样未知数的数量是分叉的个数,我们再用叶子的期望为 0 0 0 列出 n n n 个方程高斯消元即可。
时间复杂度 O ( n 3 + n 2 m k + ∣ R ∣ ) O(n^3+n^2mk+|R|) O ( n 3 + n 2 m k + ∣ R ∣ ) 。
CF963E
在平面直角坐标系上,有一个的点一开始在 ( 0 , 0 ) (0, 0) ( 0 , 0 ) 。每秒钟这个点都会随机移动:如果它在 ( x , y ) (x, y) ( x , y ) ,下一秒它在 ( x − 1 , y ) (x - 1, y) ( x − 1 , y ) 的概率是 p 1 p_1 p 1 ,在 ( x , y − 1 ) (x, y - 1) ( x , y − 1 ) 的概率是 p 2 p_2 p 2 ,在 ( x + 1 , y ) (x + 1, y) ( x + 1 , y ) 的概率是 p 3 p_3 p 3 ,在 ( x , y + 1 ) (x, y + 1) ( x , y + 1 ) 的概率是 p 4 p_4 p 4 。保证 p 1 + p 2 + p 3 + p 4 = 1 p_1 + p_2 + p_3 + p_4 = 1 p 1 + p 2 + p 3 + p 4 = 1 ,各次移动互不关联。
求出这个点移动至距离原点距离为大于 R R R 的点的期望步数。
数据范围:R ≤ 50 R\le 50 R ≤ 5 0 。
经典主元法题目。
转移方程显然,高斯消元一下,复杂度 O ( n 6 ) O(n^6) O ( n 6 ) 。选取主元为每一行最靠右的距离原点不超过 R R R 的点,然后表示出来其他点,在最左侧高斯消元即可。
时间复杂度 O ( n 3 ) O(n^3) O ( n 3 ) 。
The End
这堆题说实话大部分都不是自己做出来的,有的时候还是要看题解,甚至有题 5 月份做了现在还不会/qd。只能以后再多做做题了。