[CF850E]Random Elections

题目

传送门 to luogu

题意超级难懂,蛋疼

题目概要
有三个人, L u o L a o B a , X Y X , Z X Y \tt LuoLaoBa,XYX,ZXY LuoLaoBa,XYX,ZXY ,不妨称其为 A , B , C A,B,C A,B,C

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

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

对于 A , B A,B A,B 之间的 b a t t l e \tt battle battle ,记 x i = [ f i ( A ) > f i ( B ) ] x_i=[f_i(A)>f_i(B)] xi=[fi(A)>fi(B)] ,若 g ( x 1 , x 2 , x 3 , … , x k ) = 1 g(x_1,x_2,x_3,\dots,x_k)=1 g(x1,x2,x3,,xk)=1 A A A 胜出,否则 B B B 胜出。

为了比赛的公正,数据保证 g ( 1 − x 1 , 1 − x 2 , … , 1 − x k ) = 1 − g ( x 1 , x 2 , … , x k ) g(1-x_1,1-x_2,\dots,1-x_k)=1-g(x_1,x_2,\dots,x_k) g(1x1,1x2,,1xk)=1g(x1,x2,,xk) (否则 A , B A,B A,B B , A B,A B,A 的结果不同)。

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

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

数据范围与提示
n ≤ 20 n\le 20 n20

思路

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

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

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

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

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

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

a n s = ∑ a ∑ b 2 d ( a ⊕ b ) ⋅ g ( a ) ⋅ g ( b ) ans=\sum_{a}\sum_{b}2^{d(a\oplus b)}\cdot g(a)\cdot g(b) ans=ab2d(ab)g(a)g(b)

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

a n s = ∑ x 2 d ( x ) ⋅ t x ans=\sum_{x}2^{d(x)}\cdot t_x ans=x2d(x)tx

t x t_x tx 是可以用 F W T − x o r \tt FWT-xor FWTxor 求出来的,所以复杂度就是 O ( n ⋅ 2 n ) \mathcal O(n\cdot 2^n) O(n2n) 的,战斗结束。

代码

洞洞拐,洞洞拐,请自行写出代码,请自行写出代码,OVER!
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值