BZOJ4036-[HAOI2015]按位或-FMT

10人阅读 评论(0) 收藏 举报
分类:

说在前面

me的天哪…me看这道题看了一晚上???
这道题主要还是用到了一个性质:变换的和等于和的变换
这样的话,一个很难求和的东西,如果它的变换很好求和(有性质的支撑),那么我们就可以先变换,求和,然后再变换回去
卧槽这么简单的道理,me特喵的为什么看了一晚上???哇啊啊啊啊啊想哭

UPD:噢对,关于如何理解FMT的那三行,可以去看看这个,里面有对FMT(算是吧?)的另一种解释:
liu_runda‘s 不会FWT的选手计算集合并卷积的方法(UPD:博主智商着急了)


题目

BZOJ4036传送门

题目大意

给出一个数字N,对于0...2N1中的每个数字,给出这个数字被选择的概率,保证概率和为1
现在询问,期望选择多少次之后,所选的所有数字或起来为2N1

输入输出格式

输入格式:
第一行一个整数N,含义如题
接下来一行2N个实数,表示每个数字被选的概率

输出格式:
输出答案,误差不超过106
如果永远都无法达成,输出INF


解法

我们把给出的概率数组记作p[],并把p看作集合幂级数,定义乘法为集合或卷积

首先把答案表示出来:Ans就是k=1k(pkpk1)中第2N1项的系数。我们称呼右边这个式子为f

f拆开,发现是这样的:f=kpkpk1pk2p1p0,并不可算。(这里p0中,只有第0项为1,其他全0。因为pk的意义实际上是,选k次之后各个或集的概率。)

于是尝试一下变换,如果变换之后的计算方便,再变换回来就可以得到答案了

变换之前是集合或卷积,变换之后是对应下标的数乘。并且和的变换等于变换的和,于是
Mobius变换得到:f^=kp^kp^k1p^k2p^p^0

对于其中下标为S的某一项,我们将之单独提出来看,即f^s=kp^skp^sk1p^sk2p^s1,除开第一项,剩下的是一个等比数列。那么分类讨论一下:

  • p^s不是1,那么第一项趋于0,我们可以直接忽略它,直接求等比数列得到f^s=1p^s1
  • 是1,那么f^s=k1k11k21110=0

然后我们就得出了f^,也就是说,变换后的和是可以计算的,那么只需要逆变换回去,就能得到答案了

就做完了


下面是自带大常数的代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;

int ws , N ;
double f[(1<<20)+5] , eps = 1e-10 ;

int dcmp( double x ){
    if( x > -eps && x < eps ) return 0 ;
    return x > 0 ? 1 : -1 ;
}

int main(){
    scanf( "%d" , &ws ) , N = ( 1 << ws ) ;
    for( int i = 0 ; i < N ; i ++ )
        scanf( "%lf" , &f[i] ) ;
    for( int k = 0 ; k < 20 ; k ++ )
        for( int i = 0 ; i < N ; i ++ )
            if( i & ( 1 << k ) ) f[i] += f[ i^(1<<k) ] ;
    for( int i = 0 ; i < N ; i ++ ){
        if( !dcmp( f[i] - 1 ) ) f[i] = 0 ;
        else f[i] = 1.0 / ( f[i] - 1.0 ) ;
    }
    for( int k = 0 ; k < 20 ; k ++ )
        for( int i = 0 ; i < N ; i ++ )
            if( i & ( 1 << k ) ) f[i] -= f[ i^(1<<k) ] ;
    !dcmp( f[N-1] ) ? puts( "INF" ) : printf( "%f" , f[N-1] ) ;   
}
查看评论

[FMT 莫比乌斯变换 子集和变换] BZOJ 4036 [HAOI2015]按位或

vfk的论文题 看过组合数学 这个习称子集和变换的东西好像叫莫比乌斯变换? 那么这种变换就叫快速莫比乌斯变换 FMT? 大雾 开始推柿子 令UU表示全集 2n−12^n-1 fi,Sf_{i...
  • u014609452
  • u014609452
  • 2017-04-22 20:44:38
  • 1258

4036: [HAOI2015]按位或

4036: [HAOI2015]按位或 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special Judge Submit: 285  Solved: ...
  • CRZbulabula
  • CRZbulabula
  • 2017-02-13 21:30:22
  • 544

BZOJ4036: [HAOI2015]按位或(FMT)

传送门 题意: 刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2n−1][0,2^n-1]的数字,与你手上的数字进行按位或操作。选择数字ii的概率是pip_i。保证0=p[i]=10,...
  • qq_35649707
  • qq_35649707
  • 2018-01-17 17:16:01
  • 113

BZOJ 4036 [HAOI2015]按位或

快速莫比乌斯变换关于集合幂级数的更多内容请看2015年集训队论文最后一篇VFK的。orz orz主要思路就是把求一个集合幂级数的卷积转化成一个求子集和的问题。过程是作出莫比乌斯变换,变成求和,再快速莫...
  • ziqian2000
  • ziqian2000
  • 2017-03-24 23:52:56
  • 431

BZOJ4036: [HAOI2015]按位或

vfk论文上的题 记U=2n−1U=2n−1U=2^n-1,因为∀T⊆SU|T=U∀T⊆SU|T=U\forall_{T\subseteq S}U|T=U 我们把p看成集合幂级数,那么有 ans...
  • L_0_Forever_LF
  • L_0_Forever_LF
  • 2018-03-09 09:59:20
  • 58

HAOI2015 解题报告

先给出ydc的题解地址: http://ydc.blog.uoj.ac/blog/336 T1(树上染色): 题目地址: http://cojs.tk/cogs/problem/problem....
  • wmdcstdio
  • wmdcstdio
  • 2015-04-28 12:00:43
  • 2278

BZOJ 4036([HAOI2015]按位或-子集和变换)

Description刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行或(c++,c的|,pascal 的or)操作。选择数字i的概率是p[i]。保证0...
  • nike0good
  • nike0good
  • 2017-02-20 03:44:27
  • 223

[FMT][DP] BZOJ 4036: [HAOI2015]按位或

DescriptionDescription刚开始有一个集合为空集,全集为UU。 每次以PTP_T的概率给一个集合TT,使拥有的那个集合变成他与这个集合的并。 问变成全集UU的期望步数。Solut...
  • Vectorxj
  • Vectorxj
  • 2017-10-16 21:28:30
  • 149

bzoj 4036: [HAOI2015]Set 子集和变换

AC代码如下: #include #include #define eps 1e-10 #define N 1100005 using namespace std; int n,m,op[N]; d...
  • lych_cys
  • lych_cys
  • 2016-03-15 18:55:48
  • 1219

uoj #310. 【UNR #2】黎明前的巧克力 FWT

题意 给出n个数a[1..n],要求从其中选出两个子集,要求这两个子集至少有一个不为空集且交集为空,并且它们的异或和相等。 n,a[i]&amp;lt;=1000000 分析 注意到两个子...
  • qq_33229466
  • qq_33229466
  • 2018-03-02 20:45:12
  • 75
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 2万+
    积分: 2137
    排名: 2万+
    博客专栏