社区讨论

调了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 条回复,欢迎继续交流。

正在加载回复...