[HAOI2015] 按位或
[HAOI2015]按位或
题目描述
刚开始你有一个数字 |
,pascal 的 or
)操作。选择数字
输入格式
第一行输入
输出格式
仅输出一个数表示答案,绝对误差或相对误差不超过 INF
。
样例 #1
样例输入 #1
2
0.25 0.25 0.25 0.25
样例输出 #1
2.6666666667
提示
对于
Solution
设
这个等式也叫做
此题要求的显然是
其中
对于
时间复杂度
#include<bits/stdc++.h>
using namespace std;
constexpr int _N = (1 << 20) + 5;
constexpr double eps = 1e-8;
int n, N; double P[_N], ans;
void FWTor(double *A) {
for (int i = 1; i < N; i <<= 1)
for (int j = 0; j < N; j += i << 1)
for (int k = 0; k < i; ++k)
A[i + j + k] += A[j + k];
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n; N = 1 << n;
for (int i = 0; i < N; ++i) cin >> P[i];
FWTor(P);
for (int i = 1; i < N; ++i) if ((1 - P[(N - 1) ^ i]) > eps)
ans += ((__builtin_popcount(i) & 1) ? 1 : -1) / (1 - P[(N - 1) ^ i]);
if (ans < eps) cout << "INF" << '\n';
else cout << fixed << setprecision(10) << ans << '\n';
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步