Min-Max容斥:对于集合S
$min(S)=\sum_{s∈S}(-1)^{|s|+1}max(s)$
$max(S)=\sum_{s∈S}(-1)^{|s|+1}min(s)$
那么这个题就比较板子了,$min(s)$就是$s$任意一位有值的期望,也就是某个数字和$s$有交
不太好求?再容斥一下转化成求$s$没交的,也就是补集,这是个子集和,可以FWT或者我不会的FMT
1 #include<cmath> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int N=(1<<20)+20; 7 const double eps=1e-10; 8 int n,all; double ans,pro[N]; 9 int K(int s) 10 { 11 int cnt=0; 12 while(s) 13 cnt++,s-=s&-s; 14 return cnt%2?1:-1; 15 } 16 int main() 17 { 18 scanf("%d",&n),all=(1<<n)-1; 19 for(int i=0;i<=all;i++) 20 scanf("%lf",&pro[i]); 21 for(int i=2;i<=all+1;i<<=1) 22 { 23 int len=i>>1; 24 for(int j=0;j<=all;j+=i) 25 for(int k=j;k<j+len;k++) 26 pro[k+len]+=pro[k]; 27 } 28 for(int i=0;i<=all;i++) 29 if(1-pro[i^all]>eps) ans+=K(i)/(1-pro[i^all]); 30 fabs(ans)<=eps?printf("INF"):printf("%.10f",ans); 31 return 0; 32 }