社区讨论
调了2h调不出来一点
P4717【模板】快速莫比乌斯 / 沃尔什变换 (FMT / FWT)参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lrt8s6be
- 此快照首次捕获于
- 2024/01/25 21:20 2 年前
- 此快照最后确认于
- 2024/01/25 22:11 2 年前
rt,wa 0pts
CPP#include <bits/stdc++.h>
using namespace std;
const int MAXN = 18, MAXM = 1 << MAXN, Mod = 998244353;
struct mint {
int x;
mint operator + (const mint& a) const {return {(x + a.x) % Mod};}
mint operator - (const mint& a) const {return {(x - a.x + Mod) % Mod};}
mint operator * (const mint& a) const {return {(int)((1ll * x * a.x) % Mod)};}
} a[MAXM], b[MAXM], _a[MAXN], _b[MAXN];
void OR(int n, mint *f, mint t) {
for (int k = 1; k < n; k <<= 1) {
for (int i = 0, o = k << 1; i < n; i += o) {
for (int j = 0; j < k; ++j) {
f[i + j + k] = f[i + j + k] + f[i + j] * t;
}
}
}
}
void AND(int n, mint *f, mint t) {
for (int k = 1; k < n; k <<= 1) {
for (int i = 0, o = k << 1; i < n; i += o) {
for (int j = 0; j < k; ++j) {
f[i + j] = f[i + j] + f[i + j + k] * t;
}
}
}
}
void XOR(int n, mint *f, mint t) {
for (int k = 1; k < n; k <<= 1) {
for (int i = 0, o = k << 1; i < n; i += o) {
for (int j = 0; j < k; ++j) {
mint x = f[i + j] * t, y = f[i + j + k] * t;
f[i + j] = x + y;
f[i + j + k] = x - y;
}
}
}
}
void cpy(int n) {for (int i = 0; i < n; ++i) a[i] = _a[i], b[i] = _b[i];}
void mul(int n) {for (int i = 0; i < n; ++i) a[i] = a[i] * b[i];}
void out(int n) {
for (int i = 0; i < n; ++i) cout << a[i].x << ' ';
cout << '\n';
}
int ksm(int a, int b) {
int ans = 1;
while (b) {
if (b & 1) ans = 1ll * ans * a % Mod;
a = 1ll * a * a % Mod;
b >>= 1;
}
return ans;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("P4717_1.in", "r", stdin);
freopen("P4717_1.out", "w", stdout);
#endif
ios_base :: sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m;
cin >> n;
m = 1 << n;
for (int i = 0; i < m; ++i) {
cin >> _a[i].x;
}
for (int i = 0; i < m; ++i) {
cin >> _b[i].x;
}
int inv2 = ksm(2, Mod - 2);
cpy(m), OR(m, a, {1}), OR(m, b, {1}), mul(m), OR(m, a, {Mod - 1}), out(m);
cpy(m), AND(m, a, {1}), AND(m, b, {1}), mul(m), AND(m, a, {Mod - 1}), out(m);
cpy(m), XOR(m, a, {1}), XOR(m, b, {1}), mul(m), XOR(m, a, {inv2}), out(m);
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...