过样例 0 分求调
查看原帖
过样例 0 分求调
421781
liuzimingc楼主2024/7/23 09:32

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;
}
2024/7/23 09:32
加载中...