把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

计数与期望概率

Bracket Insertion

大概就是对最后的括号序列dp,算一下概率,用前缀和优化一下,没了?

A Random Code Problem

首先显然对于\(V=LCM(1,2,\dots,n)\),可以将每个\(A\)分解成\(aV+b\)的形式,则\(a\)一定不会被改变,可以先算出期望然后剩下\(b\)

然后设\(f_{i,j}\)表示\(i\)次操作剩\(j\)的期望值,然后再把上面的\(b\)算出答案就好了。

注意到\(17\)是不用算入\(V\)中的,所以复杂度\(O(720720k)\)

Research Rover

不会容斥(迫真

显然有用的经过障碍点个数只有\(\log S\)个剩下的全是\(1\)。那么就设\(f_{i,j}\)表示到了第\(i\)个点,经过\(j\)个障碍点的方案数。

发现不是很好dp,那就设\(f_{i,j}\)表示到了\(i\)点,至少经过\(j\)个障碍点的方案数,这个东西可以一边做一边差分,也可以最后二项式反演,做到\(O(k^2\log S)\)

ClosestRabbit

诈骗题。

这个图只会有二元环,而且显然每个联通块一个。

则枚举二元环的两个点算贡献即可。注意精度。

Yes or No

首先发现我猜什么和这个点答案出什么是独立的,也就是说状态应该形如\(f(n,m)=pf(n-1,m)+(1-p)f(n,m-1)+c\)

发现在一个点出YES个概率是\(\frac{n}{n+m}\),出NO的概率是\(\frac{m}{n+m}\),那么肯定猜大的,则概率为\(\frac{\max(n,m)}{n+m}\)

直接这样算不是很好算,首先如果碰到对角线可以看作弹回来,则至少会猜对\(\max(n,m)\)个,考虑怎么样会多,发现只有在对角线上会乱猜,这时候有\(\frac{1}{2}\)的期望,则枚举对角线上的点算贡献即可。

~K Perm Counting

显然先按\(\bmod k\)分,成为若干条链,然后考虑一条链的情况,最后背包合并。

考虑容斥,设\(f_{i,j,0/1}\)表示到了第\(i\)个点,有至少\(j\)个位置不满足,前一个数有没有选的方案数,转移显然,可以做到\(O(n^2)\)

但是\(O(n\log n)\)让我大为震撼。

考虑不用dp做一条链,实际上可以将这条链的值域和位置拆开,然后连边得到两条独立的链,每条链上选若干个连续的两个点,并且不交。选\(i\)个的方案显然是\({len-i\choose i}\),则这条链的答案平方即可。

合并发现只有两种本质不同的向量因此可以多项式快速幂,但是实际上不用因为全部乘起来也不用\(\bmod x^n\),则可以DFT之后直接快速幂算即可。

Jigsaw Puzzle

非常讨厌这种题,非常不优美。

判定性显然考虑dp套dp,内层dp对于每个往后是否延申状压起来判断是否可行,但是发现每一列有\(2^{64}\)种状态,非常不行。

事实上如果相邻的两列都向后延申,这个一定比合并成一个竖的,然后后面要么成竖的,要么延申要劣。然后状态数就变成\(2^{21}\)个。

但是如果直接上转移还要乘\(2^6\)还有个\(m\)也不太行,然后你爆搜一下发现只有\(60\)个状态有用(

所以可以直接dp,复杂度大概是\(O(\omega m2^n)\),其中\(\omega\)可以看作\(60\)

Merge Triplets

感觉上这个最终的序列应该具有某些单调性,但是也不尽然,可能出现\(3,2,1\)这种情况,要满足这三个在同一组。

又发现如果\(a>b\),且\(a,b\)在同一组,\(a\)\(b\)前面,则\(a\)选了之后一定会接着选\(b\)

所以一个三个的连续段可以断成三个\(1\),或者一个\(2\)一个\(1\),或者一个\(3\),满足段内下降,则最后的序列就是按照第一个数排序。

考虑直接对这个东西计数,设三种段数分别为\(c_1,c_2,c_3\),则有\(c_1+2c_2+3c_3=n\),并且因为一个\(2\)是被一个\(1\)断出来的,因此有\(c_1>c_2\)。将\(3n\)个数放进去的方案数是\(\frac{(3n)!}{2^{c_2}3^{c_3}}\),又因为排了序所以还要除\(c_1!c_2!c_3!\),就可以\(O(n^2)\)计数了。

Biconnected

先考虑联通图怎么计数,考虑容斥,设\(f_S\)表示\(S\)集合联通的图个数,则枚举包含最小值的集合\(T\),用总数减去\(f_T\)乘上剩下任意的方案数即可。

然后考虑在此基础上减去缩点后不是一个点的图,设\(p_{s,t}\)表示将\(t\)集合缩点以后连到\(s\)上,且\(s\)缩成一个点的方案数,则枚举加进来一个什么集合\(o\)\(p_{s,t}=p_{s,t-o}\times f_o\times \sum\limits_{(u,v)\in E}{[u\in o\and v\in s]}\),直接做枚举两重子集是\(O(4^n)\operatorname{poly}(n)\)的,就可以过了。

RowCol/ColRow Sort

有点小妙。

首先差分是显然的,枚举值\(k\),若\(A_{i,j}\leq k\),则\(C_{i,j}=1\),否则\(C_{i,j}=0\)。则如果对于每个\(k\)\(C\)排完序之后都是和\(B\)一样,那么就是合法的。

考虑行列排序的本质意义,记\(c_i\)表示\(i\)\(1\)的个数,则行排序不影响\(c\),而行排序之后的列排序相当于将\(c_i\)排序,对于列行排序就是对列排序。因为\(B\)本来就是排好序的,所以相当于找到一对排列\(p,q\),使得\(C_{i,j}=B_{p_i,q_j}\)

但是如果直接这样对\(p,q\)计数然后相乘会有问题,因为相邻的\(p,q\)显然要满足一些性质。设\(p,q\)下一个排列是\(p',q'\),则\(B_{p_i,q_i}=1\rightarrow B_{p'_i,q'_i}=1\)

将两边同时乘上\(p^{-1},q^{-1}\),得到\(B_{i,j}=1\rightarrow B_{(p'p^{-1})_i,(q'q^{-1})_i}=1\),重设\(P=p'p^{-1},Q=q'q^{-1}\),则相当于对\(P,Q\)计数,这样就可以直接乘起来。

求出当前阶段每行\(1\)的个数的\(c\)和下一阶段的个数\(d\)。如果我们在\(i\)点选择了\(P_i\),那么相当于限制了\(j\in [1,c_i]\)范围内的\(Q_j\leq d_{P_i}\)\(c,d\)都是单调的,所以直接设\(f_{i,j}\)表示确定\(P\)从高到低确定到第\(i\)位,\(Q\)从低到高确定到第\(c_j\)位的方案数,容易前缀和优化做到\(O(nm)\)。因为这个映射如果映射到\(c\)相同的地方本质相同,所以还要除一些阶乘,都是细节

总时间复杂度\(O(nmc)\),其中\(c\)是值域。

posted @ 2023-02-02 11:47  275307894a  阅读(53)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end