vfk的论文题 看过组合数学 这个习称子集和变换的东西好像叫莫比乌斯变换? 那么这种变换就叫快速莫比乌斯变换 FMT? 大雾
开始推柿子
令U表示全集
fi,S 表示 i 秒当前集合为
gi,S为其莫比乌斯变换 gi,S=∑x⊆Sfi,x
这样 gi,S=(g1,S)i 很好求 也很方便可以搞出其反变换
fi,S=∑x⊆S(−1)|S|−|x|∗gi,x
那么
Ans=======∑i=0∞1−fi,U∞−∑i=0∞fi,U∞−∑i=0∞∑x⊆U(−1)|U|−|x|∗gi,x∞−∑x⊆U(−1)|U|−|x|∑i=0∞gi,x∞−∑x⊆U(−1)|U|−|x|∑i=0∞(g1,x)i∞−∞−∑x⊆U,x≠U(−1)|U|−|x|∑i=0∞(g1,x)i∑x⊆U,x≠U(−1)|U|−|x|1g1,x−1
注意判无解
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int N=2000005;
int n,m,cnt[N];
double p[N];
int main(){
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
scanf("%d",&n); m=1<<n;
for (int i=0;i<m;i++) scanf("%lf",p+i);
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
if (j>>i&1)
p[j]+=p[j^(1<<i)],cnt[j]++;
for (int i=0;i<m-1;i++)
if (p[i]>=1-1e-8)
return printf("INF\n"),0;
double Ans=0;
for (int i=0;i<m-1;i++)
if ((n-cnt[i])&1)
Ans-=1/(p[i]-1);
else
Ans+=1/(p[i]-1);
printf("%.10lf\n",Ans);
return 0;
}