萌新求助
查看原帖
萌新求助
677234
FstAutoMaton楼主2024/8/29 15:15

样例已过,全挂。

#include <bits/stdc++.h>

using namespace std;
using LL = long long;

const int kMaxN = 2e5 + 5, kM = 998244353, kG = 3, kL = 21;

LL a[kMaxN], ans[kL][kMaxN], p[kMaxN], f[kMaxN], g[kMaxN], v[kMaxN], n, len, d;

LL P(LL x, LL y) {
  LL ans = 1;
  for (LL i = 1; i <= y; i <<= 1, x = x * x % kM) {
    (y & i) && (ans = ans * x % kM);
  }
  return ans;
}

void NTT(int len, LL a[], int op) {
  for (int i = 1; i < len; i++) {
    p[i] = (p[i >> 1] >> 1) | ((i & 1) * (len >> 1));
  }
  for (int i = 1; i < len; i++) {
    (p[i] < i) && (swap(a[i], a[p[i]]), 1);
  }
  for (int l = 1; l < len; l <<= 1) {
    LL v = P(op ? kG : P(kG, kM - 2), (kM - 1) / (l << 1));
    for (int i = 0; i < len; i += l << 1) {
      LL f = 1;
      for (int j = i; j < i + l; j++) {
        LL s = f * a[j + l] % kM;
        a[j + l] = (a[j] - s + kM) % kM, a[j] = (a[j] + s) % kM;
        f = f * v % kM;
      }
    }
  }
  if (!op) {
    for (int i = 0; i < len; i++) {
      a[i] = a[i] * P(len, kM - 2) % kM;
    }
  }
}

void Mul(int len) {
  NTT(len, f, 1), NTT(len, g, 1);
  for (int i = 0; i < len; i++) {
    f[i] = f[i] * g[i] % kM;
  }
  NTT(len, f, 0), NTT(len, g, 0);
  for (int i = n; i < len; i++) {
    f[i] = g[i] = 0;
  }
}

int main() {
  ios ::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  for (len = 1, d = 0; len < n; len <<= 1, d++) {
  }
  ans[0][0] = P(a[0], kM - 2);
  for (int i = 1; 1 << i <= len; i++) {
    int l = 1 << i;
    for (int j = 0; j < l; j++) {
      f[j] = a[j], g[j] = ans[i - 1][j];
    }
    Mul(len), Mul(len);
    for (int j = n; j < len; j++) {
      f[j] = g[j] = 0;
    }
    for (int j = 0; j < l; j++) {
      ans[i][j] = (2 * ans[i - 1][j] % kM - f[j] + kM) % kM;
    }
  }
  for (int i = 0; i < n; i++) {
    cout << ans[d][i] << " ";
  }
  return 0;
}
2024/8/29 15:15
加载中...