RT。因为本人太菜了写得晕晕乎乎的。
#include <bits/stdc++.h>
using namespace std;
namespace liuzimingc {
#define int long long
const int N = 2e6 + 5, MOD = 998244353;
const int GENSHIN = 3;
int n, m, f[N], F[N], g[N];
int qkpow(int a, int b) {
if (b < 0) return qkpow(qkpow(a, -b), MOD - 2);
int ans = 1;
while (b) {
if (b & 1) ans = ans * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return ans;
}
namespace poly {
int r[N];
void butterfly(int l) {
for (int i = 0; i < (1 << l); i++) r[i] = 0;
for (int i = 1; i < (1 << l); i++)
r[i] = (r[i >> 1] >> 1) | ((i & 1) << l - 1);
}
void get_rev(int *f, int n) {
for (int i = 1; i < n; i++)
if (i < r[i]) swap(f[i], f[r[i]]);
}
void NTT(int *f, int n, int type) {
get_rev(f, n);
for (int mid = 1; mid < n; mid <<= 1) {
int wn = qkpow(GENSHIN, type * (MOD - 1) / (mid << 1));
for (int i = 0; i < n; i += mid << 1) {
int w = 1;
for (int j = 0; j < mid; j++, w = w * wn % MOD) {
int f1 = f[i + j], f2 = w * f[i + j + mid] % MOD;
f[i + j] = (f1 + f2) % MOD;
f[i + j + mid] = (f1 - f2 + MOD) % MOD;
}
}
}
if (type == 1) return;
int inv = qkpow(n, MOD - 2);
for (int i = 0; i < n; i++) f[i] = f[i] * inv % MOD;
}
void polyinv(int *F, int *g, int n) {
if (n == 1) {
g[0] = qkpow(F[0], MOD - 2);
return;
}
polyinv(F, g, n + 1 >> 1);
int l = 0, len = 1;
while (len < (n << 1)) len <<= 1, l++;
memset(f, 0, sizeof(int) * len);
for (int i = 0; i < n; i++) f[i] = F[i];
butterfly(l);
NTT(f, len, 1); NTT(g, len, 1);
for (int i = 0; i < len; i++) g[i] = (2 - g[i] * f[i] % MOD + MOD) % MOD * g[i] % MOD;
NTT(g, len, -1);
for (int i = len; i < n; i++) g[i] = 0;
}
} // namespace poly
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
cin >> n;
for (int i = 0; i < n; i++) cin >> F[i];
poly::polyinv(F, g, n);
for (int i = 0; i < n; i++) cout << g[i] << " \n"[i == n - 1];
return 0;
}
#undef int
} // namespace liuzimingc
int main() {
liuzimingc::main();
return 0;
}