设 A A A为原多项式,所求为多项式 B B B
即有 A × B ≡ 1 m o d    x n A \times B \equiv 1 \mod x^n A×B≡1modxn
设 A × B ′ ≡ 1 m o d    x n 2 A \times B' \equiv 1 \mod x^{\frac n 2} A×B′≡1modx2n
A × ( B − B ′ ) ≡ 0 m o d    x n 2 A \times (B - B') \equiv 0 \mod x^{\frac n 2} A×(B−B′)≡0modx2n
B − B ′ ≡ 0 m o d    x n 2 B - B' \equiv 0 \mod x^{\frac n 2} B−B′≡0modx2n
( B − B ′ ) 2 ≡ 0 m o d    x n (B - B')^2 \equiv 0 \mod x ^n (B−B′)2≡0modxn
B 2 − 2 B B ′ + B ′ 2 ≡ 0 m o d    x n B^2 - 2BB' + B'^2 \equiv 0 \mod x ^n B2−2BB′+B′2≡0modxn
A ( B 2 − 2 B B ′ + B ′ 2 ) ≡ 0 m o d    x n A(B^2 - 2BB' + B'^2) \equiv 0 \mod x^n A(B2−2BB′+B′2)≡0modxn
B − 2 B ′ + A B ′ 2 ≡ 0 m o d    x n B - 2B' + AB'^2 \equiv 0 \mod x^n B−2B′+AB′2≡0modxn
B ≡ 2 B ′ − A B ′ 2 m o d    x n B \equiv 2B' - AB'^2 \mod x^n B≡2B′−AB′2modxn
倍增求解即可。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll ;
inline int read() {
int x = 0, f = 1; char c; c = getchar() ;
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar() ;
return x * f ;
}
const int maxn = 262150, mod = 998244353, g = 3 ;
int ginv ;
int a[maxn], b[maxn], A[maxn], B[2][maxn];
inline ll power (ll x, int y) {
ll res = 1 ;
while (y) {
if (y & 1) res = res * x % mod ;
x = x * x % mod; y >>= 1 ;
}
return res ;
}
inline void ntt (int a[], int n, int f) {
for (int i = 0, j = 0; i < n; i ++) {
if (i > j) swap (a[i], a[j]) ;
for (int t = n >> 1; (j ^= t) < t; t >>= 1) ;
}
for (int i = 2; i <= n; i <<= 1) {
int wn = power (f ? ginv : g, (mod - 1) / i) ;
for (int j = 0; j < n; j += i) {
int w = 1 ;
for (int k = 0; k < (i >> 1); k ++, w = 1ll * w * wn % mod) {
ll A = a[j + k], B = 1ll * w * a[j + k + (i >> 1)] % mod ;
a[j + k] = (A + B) % mod; a[j + k + (i >> 1)] = (A - B + mod) % mod ;
}
}
}
if (f) {
ll invn = power (n, mod - 2) ;
for (int i = 0; i < n; i ++) a[i] = a[i] * invn % mod ;
}
}
inline void mul (int A[], int B[], int n) {
memset (a, 0, sizeof a) ;
memset (b, 0, sizeof b) ;
for (int i = 0; i < n / 2; i ++)
a[i] = A[i], b[i] = B[i] ;
ntt (a, n, 0); ntt (b, n, 0) ;
for (int i = 0; i < n; i ++) a[i] = 1ll * a[i] * b[i] % mod ;
ntt (a, n, 1) ;
for (int i = 0; i < n; i ++) A[i] = a[i] ;
}
inline void inv (int A[], int n) {
int cur = 0, bas = 1, lim = 2 ;
B[cur][0] = power (A[0], mod - 2) ;
while (bas <= (n << 1)) {
cur ^= 1 ;
memset (B[cur], 0, sizeof B[cur]) ;
for (int i = 0; i < bas; i ++)
B[cur][i] = 1ll * 2 * B[cur ^ 1][i] % mod ;
mul (B[cur ^ 1], B[cur ^ 1], lim) ;
mul (B[cur ^ 1], A, lim) ;
for (int i = 0; i < bas; i ++)
B[cur][i] = (B[cur][i] - B[cur ^ 1][i] + mod) % mod ;
bas <<= 1; lim <<= 1 ;
}
for (int i = 0; i <= n; i ++) A[i] = B[cur][i] ;
}
int main() {
ginv = power (g, mod - 2) ;
int n = read() - 1 ;
for (int i = 0; i <= n; i ++) A[i] = read() ;
inv (A, n) ;
for (int i = 0; i <= n; i ++) printf("%d ", A[i]) ;
printf("\n") ;
return 0 ;
}