首页 > 其他分享 >P3175 [HAOI2015]按位或

P3175 [HAOI2015]按位或

时间:2022-11-15 19:56:03浏览次数:47  
标签:min max sum P3175 HAOI2015 按位 oplus

P3175 [HAOI2015]按位或

设\(A_i\)表示第\(i\)位变为\(1\)的时间,那么答案就是\(max(A)\)。发现\(max(A)\)不好直接求,但\(min(A)\)很好求,考虑\(min-max\)容斥。
那么 \(E(max(A)) = \sum_{T \subseteq A}(-1)^{|T| + 1}E(min(T))\)
其中 \(E(min(T)) = \sum_{k \ge 1} k * P(min(T))_k\),其中 \(P(min(T))_k\)表示第\(k\)秒,选中了\(T\)中的数。
那么 \(P(min(T))_k = f(T \oplus U)^{k-1} * (1 - f(T \oplus U))\),其中\(U\)为全集,\(f(X) = \sum_{x \subseteq X}p_x\),\(p_x\)为选\(x\)的概率。
带入得\(E(min(T)) = \frac{1}{1 - f(T \oplus U)}\)。
那么\(f\)用\(FWT\)求即可。

Code
#include<cstdio>
using namespace std;
const int N = 1 << 21;
int n, siz[N]; double p[N], f[N];

int main()
{
	scanf("%d",&n);
	for (int i = 0; i < (1 << n); i++) scanf("%lf", &p[i]);
	for (int i = 0; i < n; i++)
		for (int j = 0; j < (1 << n); j++)
			if (j & (1 << i)) p[j] += p[j ^ (1 << i)]; 
	for (int i = 0; i < (1 << n); i++) f[i] = 1.0 / (1.0 - p[i ^ ((1 << n) - 1)]);
	double ans = 0;
	for (int i = 1; i < (1 << n); i++) {
		if (1 - p[i ^ ((1 << n) - 1)] < 1e-10){puts("INF"); return 0;}
		siz[i] = siz[i >> 1] + (i & 1), ans += (siz[i] & 1 ? 1.0 : -1.0) * f[i]; 
	}
	printf("%.9lf\n", ans);
}

标签:min,max,sum,P3175,HAOI2015,按位,oplus
From: https://www.cnblogs.com/nibabadeboke/p/16893671.html

相关文章

  • 两个数按位异或 按位或 按位与的最大值
    and:就是从最高的一位向下找,如果这一位为1的数多于两个就取出这些数,然后再取出的这些数里面继续下一位的一样的处理,我就用递归写的or:这个比较巧妙,也比较暴力,先每个数开一......
  • P3178 [HAOI2015]树上操作
    #include<iostream>usingnamespacestd;#defineintlonglongconstintN=100000+1;intn,m,a[N];structnode{inttag,sum;};nodetree[......
  • BZOJ 4036([HAOI2015]按位或-子集和变换)
    Description刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行或(c++,c的|,pascal的or)操作。选择数字i的概率是p[i]。保证0<=p[i]<=1,Σp[i]=......
  • 关于负数补码为什么原码是按位取反再+1
     8位下,求123和-123的补码。8位补码表示的值为-128-127。[-123]补码=[-01111011]补码=2^8+(-01111011)......
  • 123按位取反是多少?原码、反码、补码及其运算
    如题,在整数运算中总是不清楚某个数的取反和反码到底有什么区别,遂写下此博客,有参考的地方在文末中会贴出出处。在阅读本文章之后会对你了解计算机中一些基础有所帮助,文章包......
  • 按位非计算
    按位非正整数的补码,反码是其本身.​ eg:1的原码是0000 0001,反码和原码是0000 0001负整数的补码,是符号位不变,其余位按位取反,再加1。​ eg:-1的原码是1000 0001,补码1111 1......
  • 逻辑运算与按位运算
    Verilog语法中的运算有逻辑运算和按位运算两种:逻辑运算:把多位操作数视为1位,多位中有1就视为1,否则视为0,其结果为0/1/x三种。按位运算:对应的每一位分别求xx,结果仍......
  • 201. 数字范围按位与
     难度中等398收藏分享切换为英文接收动态反馈给你两个整数 left 和 right ,表示区间 [left,right] ,返回此区间内所有数字 按位与 的结果(包含 left 、rig......
  • Java按位操作工具类
    /***Bit转换工具*/@SuppressWarnings({"WeakerAccess","unused"})publicclassConvertBit{/***短整型(int16)数据中包含的有效bit数量*/......
  • NC19996 [HAOI2015]树上染色
    题目链接题目题目描述有一棵点数为N的树,树边有边权。给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色。将所有点染色后,你会......