样例通过全WA求调
查看原帖
样例通过全WA求调
608273
___PatrickChen___楼主2025/1/10 10:50
#include <bits/stdc++.h>
#define endl '\n'

using namespace std;

using ll = long long;

const ll N = 2097152, P = 998244353, inv2 = 499122177;

ll n, m, A[N], B[N], C[N], D[N], F[N], G[N], r[N], pw[N], iv[N], l, tlen;

ll qpow(ll a, ll k) {
	ll res = 1;
	for (; k; k >>= 1, (a *= a) %= P) {
		if (k & 1) (res *= a) %= P;
	}
	return res;
}

namespace Poly {

void init() {
	for (int i = 1, j = 2; j <= N; ++i, j <<= 1) {
		pw[i] = qpow(3, (P - 1) / j);
		iv[i] = qpow(pw[i], P - 2);
	}
}

void calc(ll len) {
	for (l = 1, tlen = 0; l <= len; l <<= 1) ++tlen;
	--tlen;
	for (int i = 0; i < l; ++i) r[i] = (r[i >> 1] >> 1) | ((i & 1) << tlen);
}

void NTT(ll a[], int type) {
	for (int i = 0; i < l; ++i) {
		if (i < r[i]) swap(a[i], a[r[i]]);
	}
	for (int mid = 1, i = 1; mid < l; mid <<= 1, ++i) {
		ll w_n = (type == 1) ? pw[i] : iv[i];
		for (int j = 0, R = mid << 1; j < l; j += R) {
			ll w = 1;
			for (int k = 0; k < mid; ++k, w = w * w_n % P) {
				ll t = w * a[j + k + mid] % P;
				a[j + k + mid] = (a[j + k] + P - t) % P;
				a[j + k] = (a[j + k] + t) % P;
			}
		}
	}
	if (type == -1) {
		ll inv = qpow(l, P - 2);
		for (int i = 0; i <= l; ++i) (a[i] *= inv) %= P;
	}
}

void mul(ll f[], ll g[], int n) {
	calc(n);
	NTT(f, 1);
	if (f != g) NTT(g, 1);
	for (int i = 0; i < l; ++i) (f[i] *= g[i]) %= P;
	NTT(f, -1);
	if (f != g) NTT(g, -1);
}

void inv(ll f[], ll g[], int n) {
	if (n == 1) {
		g[0] = qpow(f[0], P - 2);
		return;
	}
	inv(f, g, n + 1 >> 1);
	for (int i = 0; i < n; ++i) C[i] = f[i], D[i] = g[i];
	for (int i = n; i < l; ++i) C[i] = D[i] = 0;
	mul(C, D, n);
	mul(C, D, n);
	for (int i = 0; i < n; ++i) g[i] = ((2ll * g[i] % P - C[i]) % P + P) % P;
	for (int i = 0; i < n; ++i) C[i] = D[i] = 0;
}

void devirate(ll A[], ll B[], ll len) {
	for (int i = 1; i < len; ++i) B[i - 1] = i * A[i] % P;
	B[len - 1] = 0;
}

void intergral(ll A[], ll B[], ll len) {
	for (int i = 1; i < len; ++i) B[i] = A[i - 1] * qpow(i, P - 2) % P;
	B[0] = 0;
}

void ln(ll f[], ll g[], int n) {
	devirate(f, A, n);
	inv(f, B, n);
	mul(A, B, n);
	intergral(A, g, n);
	for (int i = 0; i < n; ++i) A[i] = B[i] = 0;
}

void exp(ll f[], ll g[], int n) {
	if (n == 1) {
		g[0] = 1;
		return;
	}
	exp(f, g, n + 1 >> 1);
	ln(g, C, n);
	C[0] = ((f[0] + 1 - C[0]) % P + P) % P;
	for (int i = 1; i < n; ++i) C[i] = ((f[i] - C[i]) % P + P) % P;
	for (int i = n; i < n << 1; ++i) C[i] = 0;
	mul(g, C, n);
	for (int i = 0; i < n; ++i) C[i] = 0;
}

void sqrt(ll f[], ll g[], int n) {
	if(n == 1) {
		g[0] = 1;
		return;
	}
	sqrt(f, g, n + 1 >> 1);
	for (int i = 0; i < n << 1; ++i) A[i] = 0;
	inv(g, A, n);
	mul(A, f, n << 2);
	for(int i = 0; i < n; ++i) g[i] = (g[i] + A[i]) * inv2 % P;
}

}

void init() {
	Poly::init();
}

void solve() {
	cin >> n;
	for (int i = 0; i < n; ++i) cin >> F[i];
	for (m = 1; m <= n; m <<= 1);
	Poly::sqrt(F, G, m);
	for (int i = 0; i < n; ++i) cout << G[i] << " \n"[i == n - 1];
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int _ = 1;
	// cin >> _;
	init();
	while (_--) solve();
	return 0;
}
2025/1/10 10:50
加载中...