[CF850E]Random Elections

题目

传送门 to luogu

题意超级难懂,蛋疼

题目概要
有三个人,LuoLaoBa,XYX,ZXY\tt LuoLaoBa,XYX,ZXY ,不妨称其为 A,B,CA,B,C

另有 2n2^n 个人,第 ii 个人有期待顺序,记为 fif_i ,满足 {fi(A),fi(B),fi(C)}={1,2,3}\{f_i(A),f_i(B),f_i(C)\}=\{1,2,3\}

还会告诉你一个 2n2^n 元函数 g(x1,x2,x3,,xk){0,1}g(x_1,x_2,x_3,\dots,x_{k})\in\{0,1\} ,其中 xi{0,1},k=2nx_i\in\{0,1\},k=2^n

对于 A,BA,B 之间的 battle\tt battle ,记 xi=[fi(A)>fi(B)]x_i=[f_i(A)>f_i(B)] ,若 g(x1,x2,x3,,xk)=1g(x_1,x_2,x_3,\dots,x_k)=1AA 胜出,否则 BB 胜出。

为了比赛的公正,数据保证 g(1x1,1x2,,1xk)=1g(x1,x2,,xk)g(1-x_1,1-x_2,\dots,1-x_k)=1-g(x_1,x_2,\dots,x_k) (否则 A,BA,BB,AB,A 的结果不同)。

fif_i 均是随机的(即,fi(A),fi(B),fi(C)\langle f_i(A),f_i(B),f_i(C)\rangle{1,2,3}\{1,2,3\} 的排列中等概率随机),求出这个事件发生的概率:A,B,CA,B,C 两两进行 battle\tt battle 后,至少有一人赢了两场。

输出时乘以 6n6^n ,这样就一定会输出一个整数。答案或许很大,最好输出对 109+710^9+7 取模的值。

数据范围与提示
n20n\le 20

思路

首先注意到,AA 赢了两场,B,CB,C 就不可能有赢了两场的情况。所以直接讨论一个人的情况,然后乘 33 就好。

讨论 CCA,BA,B 的对局情况。不妨设为 a,ba,b 。根据题意,显然有

g(a)g(b)=1g(a)g(b)=1

然后我们继续讨论方案数。随便讨论一个人 ii 吧,若 ai=1,bi=0a_i=1,b_i=0 ,那么唯一的可能就是 fi(A)>fi(C)>fi(B)f_i(A)>f_i(C)>f_i(B) 。反之,若 ai=bia_i=b_i 便有两种情况。所以最后的情况数量就是

2d(ab)2^{d(a\oplus b)}

其中 dd 表示二进制下 00 的个数。所以答案是

ans=ab2d(ab)g(a)g(b)ans=\sum_{a}\sum_{b}2^{d(a\oplus b)}\cdot g(a)\cdot g(b)

啊哈,令 tx=ab=xg(a)g(b)t_x=\sum_{a\oplus b=x}g(a)g(b) ,则

ans=x2d(x)txans=\sum_{x}2^{d(x)}\cdot t_x

txt_x 是可以用 FWTxor\tt FWT-xor 求出来的,所以复杂度就是 O(n2n)\mathcal O(n\cdot 2^n) 的,战斗结束。

代码

洞洞拐,洞洞拐,请自行写出代码,请自行写出代码,OVER!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章