[HAOI2015]按位或——Min-Max容斥+FWT

题面

  Bzoj4036

解析

  考虑$ans=E(max(t[i])), i\in S, S=\begin{Bmatrix} 1,2,\cdots, n\end{Bmatrix}$,这里$t[i]$表示第$i$位变成$1$的时间,$E(max(t[i]))$表示最后变成$1$的一位的期望时间,暂时记为$E(max(S))$,注意这个不等于$max(E(S))$

  然后套上$Min-Max$容斥,$ans=\sum_{T \subseteq S}E(min(T))$,$E(min(T))$表示$T$中至少有一位变成$1$的期望时间。

  $E(min(T))$似乎不太好求,考虑补集转换,$E(min(T))=\frac{1}{1-\sum_{i\cap T=\varnothing }p[i]}$,$p$为题目中给出的数组,若将$T$视为二进制数,则$E(min(T))=\frac{1}{1-\sum_{i\&T=0}p[i]}$

  而$\sum_{i\&T==0}p[i]$就等于$T$的补集的子集和,因此只需要$FWT(or)$一次就可以了。

 代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = (1 << 20) + 5;
const double eps = 1e-11;

int n, m, num[maxn];
double a[maxn];
bool used[25];

void FWT_or(double *x)
{
    for(int i = 1; i <= m; i <<= 1)
        for(int j = 0; j <= m; j += (i << 1))
            for(int k = 0; k < i; ++k)
                x[i+j+k] += x[j+k];
}

int main()
{
    scanf("%d", &n);
    m = (1 << n) - 1;
    for(int i = 0; i <= m; ++i)
    {
        scanf("%lf", &a[i]);
        num[i] = num[i>>1] + (i & 1);
        if(a[i] > eps)
        {
            for(int j = 0; j < n; ++j)
                if((i >> j) & 1)
                    used[j] = 1;
        }
    }
    for(int j = 0; j < n; ++j)
        if(!used[j])
        {
            printf("INF");
            return 0;
        }
    FWT_or(a);
    double ans = 0;
    for(int i = 1; i <= m; ++i)
        ans += ((num[i] & 1)? 1: -1) / (1 - a[m^i]);
    printf("%.10f", ans);
    return 0;
}

原文地址:https://www.cnblogs.com/Joker-Yza/p/12393764.html

时间: 2024-08-30 06:10:35

[HAOI2015]按位或——Min-Max容斥+FWT的相关文章

【洛谷U20626】gemo 容斥 FWT 高斯消元

题目大意 给你一个无向图,有\(m\)个询问,每次给你一个点\(x\)和一个点集\(S\),问你从\(x\)开始走,每次从一个点随机的走到与这个点相邻的点,问你访问\(S\)中每个点至少一次的期望步数是多少. \(n\leq 18,m\leq 100000\) 题解 有个东西叫min-max容斥: \[ \max(S)=\sum_{T\subseteq S}{(-1)}^{|T|+1}\min(T) \] 这道题中,\(\min(S)\)是从点\(x\)开始走,走到\(S\)中任意一个点的期望步

「总结」容斥。二.反演原理

二.反演原理 0.综述 说一下个人对反演的理解. 反演是一种手段,一种处理已知信息和未知信息关系的手段,用来得到未知信息的方式.也就是以一种既定的手段在较小的时间复杂度内用已知的信息得到未知的信息. 还有$zsq$学长更加浅显的解读. 反演一般就是把一个好看但难算的式子转化成一个难看且难算的式子在转化为一个难看但好算的式子. 先来一个裸一点的反演 下面要说我知道的四种反演. 子集反演,针对的是集合交并的容斥. 二项式反演,针对组合原理的容斥. 莫比乌斯反演,针对约数和倍数的容斥. 斯特林反演,针

bzoj 4036 按位或 —— min-max容斥+FMT

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4036 min-max容斥:https://blog.csdn.net/ez_2016gdgzoi471/article/details/81416333 二项式反演:https://blog.csdn.net/ez_2016gdgzoi471/article/details/81408416 而出现 \( S \) 的期望,就是 \( S \) 每一位出现的期望中的最大值: 所以 \( E

【题解】毒蛇越狱(FWT+容斥)

[题解]毒蛇越狱(FWT+容斥) 问了一下大家咋做也没听懂,按兵不动没去看题解,虽然已经晓得复杂度了....最后感觉也不难 用FWT_OR和FWT_AND做一半分别求出超集和和子集和,然后 枚举问号是01,裸的,\(O(2^{cnt[?]})\) 默认问号是1,利用子集和求,\(O(2^{cnt[1]})\) 默认问号是0,利用超集和求,\(O(2^{cnt[0]})\) 可以知道\(min(cnt)\le n/3\),所以复杂度\(O(n2^n 2^{n/3}Q)\) //@winlere #

bzoj4036 / P3175 [HAOI2015]按位或

bzoj4036 / P3175 [HAOI2015]按位或 是一个 min-max容斥 的板子题. min-max容斥 式子: $ \displaystyle max(S) = \sum_{T\sube S} (-1)^{|T|+1} min(T) $ 并且很优秀的是,它在期望情况下成立! 这个有什么关系呢.. 如果每一位分开考虑,如果第 $ i $ 位变成 1 的期望时间是 $ T(i) $ 那么求的是 $ E(max(T_{1\dots n})) $ 这个可以 min-max容斥 求 $

[HAOI2015]按位或

Description 刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行或(c++,c的|,pascal的or)操作.选择数字i的概率是p[i].保证0<=p[i]<=1,Σp[i]=1问期望多少秒后,你手上的数字变成2^n-1. Input 第一行输入n表示n个元素,第二行输入2^n个数,第i个数表示选到i-1的概率 Output 仅输出一个数表示答案,绝对误差或相对误差不超过1e-6即可算通过.如果无解则要输出INF Sample Input 2

min-max容斥

这玩意儿一般都是跟概率期望结合的吧,就是下面这个式子(\(max(S)\)代表集合\(S\)中的最大值,\(min(S)\)同理): \[max(S)=\sum\limits_{T\subseteq S}(-1)^{\left | T \right |-1}min(T)\] 证明的话就考虑第\(k\)大的元素对\(max(S)\)的贡献就行了,把式子列出来之后你会发现它的贡献只有在\(k=1\)时才为\(1\),在\(k>1\)全部为\(0\) 能用它做的期望题一般都是这样的:每次操作把集合中的

Min-Max 容斥的证明

这里有 Min-Max 容斥的证明以及唯一一道博主做过的例题... 上个结论: \[Min\{S\}=\sum_{T\subseteq S,T\not=\varnothing}(-1)^{|T|-1}Max\{T\} \] \[Max\{S\}=\sum_{T\subseteq S,T\not=\varnothing}(-1)^{|T|-1}Min\{T\} \] 具体的证明其实很简单...我们考虑证明其中一个(以第一个为例),另一个可以用类似证法得到结论.咱直接考虑集合内元素不重的情况,因为相

hdu1695:数论+容斥

题目大意: 求x属于[1,b]和 y属于[1,d]的 gcd(x,y)=k 的方案数 题解: 观察发现 gcd()=k 不好处理,想到将x=x/k,y=y/k 后 gcd(x,y)=1.. 即问题转化为求区间 [1,b/k]和 [1,d/k]的互质数对个数 由于题目规定 (x,y)和(y,x)是同一种,所以我们可以规定 x<y,,然后只需对每一个y求出比他小的即可 公共部分可以通过欧拉函数快速求出.. 非公共部分就不行了.. 所以就分解质因数,用容斥的方法求了 #include <iostre