題面
剛開始你有一個數字,每一秒鐘你會隨機選擇一個的數字,與你手上的數字進行或操作。選擇數字的概率是。保證,問期望多少秒後,你手上的數字變成。
題解
論文題。
代碼很短。20行。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1<<20;
const double eps = 1e-8;
int n;
void FMT(double *f, int flg) {
for(int i = 0; i < n; ++i)
for(int s = 0; s < 1<<n; ++s)
if(!(s>>i&1)) f[s|(1<<i)] += flg==1?f[s]:-f[s];
}
double p[MAXN], f[MAXN];
int main () {
scanf("%d", &n);
for(int s = 0; s < 1<<n; ++s) scanf("%lf", &p[s]);
FMT(p, 1);
for(int s = 0; s < 1<<n; ++s)
if(fabs(p[s]-1) < eps) f[s] = 0;
else f[s] = - 1.0 / (1 - p[s]);
FMT(f, -1);
double ans = f[(1<<n)-1];
if(fabs(ans) < eps) puts("INF");
else printf("%.10f\n", ans);
}