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(S) = max(S) = \sum\limits_{T \subseteq S} (-1)^{|T|-1} min(T) \)

\( min(T) = \frac{1}{ \sum\limits_{K \cap T \neq \varnothing} p_{K} } \)

\( \sum\limits_{K \cap T \neq \varnothing} p_{K} = 1 - \sum\limits_{k \subseteq C_{U}^{T} } p_{k} \)

求个高维前缀和(FMT)即可。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define eps 1e-6
using namespace std;
typedef double db;
int const xn=(1<<20)+5;
int n,bin[25];
bool vis[25]; db p[xn],mn[xn];
int cal(int s){int ret=0; while(s)ret+=(s&1),s>>=1; return ret;}
void fmt(db *a,int tp)
{
  for(int d=1;d<bin[n];d<<=1)
    for(int s=0;s<bin[n];s++)
      if(s&d)a[s]+=a[s^d]*tp;
}
int main()
{
  scanf("%d",&n);
  bin[0]=1; for(int i=1;i<=n;i++)bin[i]=(bin[i-1]<<1);
  for(int i=0;i<bin[n];i++)
    {
      scanf("%lf",&p[i]);
      if(p[i]){for(int d=0;d<n;d++)if(i&bin[d])vis[d]=1;}
    }
  for(int i=0;i<n;i++)if(!vis[i]){puts("INF"); return 0;}
  fmt(p,1);
  for(int s=1;s<bin[n];s++)
    if(1-p[(bin[n]-1)^s]>eps)mn[s]=1.0/(1-p[(bin[n]-1)^s]);//s=1
  db ans=0;
  for(int s=1;s<bin[n];s++)ans+=mn[s]*((cal(s)&1)?1:-1);//s=1
  printf("%.10f\n",ans);
  return 0;
}

原文地址:https://www.cnblogs.com/Zinn/p/10260126.html

时间: 2024-07-30 12:52:56

bzoj 4036 按位或 —— min-max容斥+FMT的相关文章

【BZOJ 3771】 3771: Triple (FFT+容斥)

3771: Triple Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 547  Solved: 307 Description 我们讲一个悲伤的故事. 从前有一个贫穷的樵夫在河边砍柴. 这时候河里出现了一个水神,夺过了他的斧头,说: "这把斧头,是不是你的?" 樵夫一看:"是啊是啊!" 水神把斧头扔在一边,又拿起一个东西问: "这把斧头,是不是你的?" 樵夫看不清楚,但又怕真的是自己的斧头,只好又

bzoj 2301 Problem b 莫比乌斯反演+容斥

题意:对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数 思路:在hdu1695的基础上加上容斥,即:ans=solve(b/k,d/k)-solve((a-1)/k,d/k)-solve((c-1)/k,b/k)+solve((a-1)/k,(c-1)/k),详见代码: /********************************************************* file n

BZOJ 2005 [Noi2010]能量採集 (容斥)

[Noi2010]能量採集 Time Limit: 10 Sec  Memory Limit: 552 MB Submit: 2324  Solved: 1387 [Submit][Status][Discuss] Description 栋栋有一块长方形的地.他在地上种了一种能量植物,这样的植物能够採集太阳光的能量.在这些植物採集能量后,栋栋再使用一个能量汇集机器把这些植物採集到的能量汇集到一起. 栋栋的植物种得很整齐.一共同拥有n列,每列有m棵,植物的横竖间距都一样,因此对于每一棵植物.栋栋

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

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4036 题解:https://www.cnblogs.com/Zinn/p/10260126.html #include<cstdio> #include<cstring> #include<algorithm> #define db double using namespace std; const int N=25,M=(1<<20)+5; int

BZOJ 3456 NTT图的计数 容斥

思路: RT 懒得写了 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int N=(1<<18)+5,mod=1004535809; int tmp[N],R[N],fac[N],A[N],B[N],C[N],niB[N]; int pow(ll x,ll y){

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

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

BZOJ 4036: [HAOI2015]按位或 集合幂函数 莫比乌斯变换 莫比乌斯反演

http://www.lydsy.com/JudgeOnline/problem.php?id=4036 http://blog.csdn.net/lych_cys/article/details/50898726 http://blog.csdn.net/qq_21995319/article/details/49800999 for(int i=1;i<=1;i++) for(int j=1;j<=1;j++) f[i○j]=a[i]*b[j]; 当○为按位或时,这种运算就称为集合并卷积.

[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$中

[BZOJ 1042] [HAOI2008] 硬币购物 【DP + 容斥】

题目链接:BZOJ - 1042 题目分析 首先 Orz Hzwer ,代码题解都是看的他的 blog. 这道题首先使用DP预处理,先求出,在不考虑每种硬币个数的限制的情况下,每个钱数有多少种拼凑方案. 为了避免重复的方案被转移,所以我们以硬币种类为第一层循环,这样阶段性的增加硬币. 一定要注意这个第一层循环要是硬币种类,并且初始 f[0] = 1. f[0] = 1; for (int i = 1; i <= 4; ++i) { for (int j = B[i]; j <= MaxS; +