题目
传送门 to luogu
题意超级难懂,蛋疼
题目概要
有三个人,LuoLaoBa,XYX,ZXY ,不妨称其为 A,B,C 。
另有 2n 个人,第 i 个人有期待顺序,记为 fi ,满足 {fi(A),fi(B),fi(C)}={1,2,3} 。
还会告诉你一个 2n 元函数 g(x1,x2,x3,…,xk)∈{0,1} ,其中 xi∈{0,1},k=2n 。
对于 A,B 之间的 battle ,记 xi=[fi(A)>fi(B)] ,若 g(x1,x2,x3,…,xk)=1 则 A 胜出,否则 B 胜出。
为了比赛的公正,数据保证 g(1−x1,1−x2,…,1−xk)=1−g(x1,x2,…,xk) (否则 A,B 与 B,A 的结果不同)。
若 fi 均是随机的(即,⟨fi(A),fi(B),fi(C)⟩ 在 {1,2,3} 的排列中等概率随机),求出这个事件发生的概率:A,B,C 两两进行 battle 后,至少有一人赢了两场。
输出时乘以 6n ,这样就一定会输出一个整数。答案或许很大,最好输出对 109+7 取模的值。
数据范围与提示
n≤20 。
思路
首先注意到,A 赢了两场,B,C 就不可能有赢了两场的情况。所以直接讨论一个人的情况,然后乘 3 就好。
讨论 C 对 A,B 的对局情况。不妨设为 a,b 。根据题意,显然有
g(a)g(b)=1
然后我们继续讨论方案数。随便讨论一个人 i 吧,若 ai=1,bi=0 ,那么唯一的可能就是 fi(A)>fi(C)>fi(B) 。反之,若 ai=bi 便有两种情况。所以最后的情况数量就是
2d(a⊕b)
其中 d 表示二进制下 0 的个数。所以答案是
ans=a∑b∑2d(a⊕b)⋅g(a)⋅g(b)
啊哈,令 tx=∑a⊕b=xg(a)g(b) ,则
ans=x∑2d(x)⋅tx
而 tx 是可以用 FWT−xor 求出来的,所以复杂度就是 O(n⋅2n) 的,战斗结束。
代码
洞洞拐,洞洞拐,请自行写出代码,请自行写出代码,OVER!