把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

poly模板

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#define int long long
#define N 270004
#define isdigit(ch) ('0' <= ch && ch <= '9')
#define clr(f,n) memset(f,0,sizeof(int) * (n))
#define cpy(f,g,n) memcpy(f,g,sizeof(int) * (n))
using namespace std;
template<typename T>
void read(T&x) {
	x = 0;
	int f = 1;
	char ch = getchar();
	for (;!isdigit(ch);ch = getchar()) f = (ch == '-' ? -1 : f);
	for (;isdigit(ch);ch = getchar()) x = (x << 1) + (x << 3) + (ch ^ 48);
	x *= f;
}
template<typename T>
void write(T x) {
	if (x < 0) x = -x,putchar('-');
	if (x > 9) write(x / 10);
	putchar(x % 10 + '0');
}
int qpow(int a,int b,int mod = 998244353) {
	int res = 1;
	while(b) {
		if (b & 1) res = res * a % mod;
		a = a * a % mod;
		b >>= 1;
	}
	return res;
}
const int mod = 998244353,G = 3,invg = qpow(G,mod - 2);
void printp(int *f,int n) {
	for (int i = 0;i <= n;i ++) write(f[i]),putchar(' ');
	putchar('\n');
} 
int tr[N],tf;
void tpre(int n) {
	if (n == tf) return;
	tf = n;
	for (int i = 0;i < n;i ++)
		tr[i] = (tr[i >> 1] >> 1) | (i & 1 ? n >> 1 : 0);
}
void ntt(int *f,int n,bool flag) {
	tpre(n);
	for (int i = 0;i < n;i ++)
		if (i < tr[i]) swap(f[i],f[tr[i]]);
	static int w[N] = {1};
	for (int p = 2;p <= n;p <<= 1) {
		int rotate = qpow(flag ? G : invg,(mod - 1) / p),len = p >> 1;
		for (int i = 1;i < len;i ++) w[i] = w[i - 1] * rotate % mod;
		for (int st = 0;st < n;st += p)
			for (int i = st;i < st + len;i ++) {
				int tt = f[i + len] * w[i - st] % mod;
				f[i + len] = f[i] - tt;
				if (f[i + len] < 0) f[i + len] += mod;
				f[i] = (f[i] + tt) % mod;
			}
	} 
	if (!flag) {
		int invn = qpow(n,mod - 2);
		for (int i = 0;i < n;i ++) f[i] = f[i] * invn % mod;
	}
}
void px(int *f,int *g,int n) {
	for (int i = 0;i <= n;i ++) f[i] = f[i] * g[i] % mod;
}
void mulp(int *f,int *g,int n,int m) {
	for (m += n,n = 1;n <= m;n <<= 1);
	ntt(f,n,1),ntt(g,n,1);
	px(f,g,n);
	ntt(f,n,0);
}
void invp(int *f,int m) {
	int n;
	for (n = 1;n <= m;n <<= 1);
	static int w[N],r[N],sav[N];
	w[0] = qpow(f[0],mod - 2);
	for (int p = 2;p <= n;p <<= 1) {
		for (int i = 0;i < (p >> 1);i ++) r[i] = w[i] % mod;
		cpy(sav,f,p);
		ntt(r,p,1),ntt(sav,p,1);
		px(r,sav,p);
		ntt(r,p,0);
		clr(r,p >> 1);
		cpy(sav,w,p);
		ntt(sav,p,1),ntt(r,p,1);
		px(r,sav,p);
		ntt(r,p,0);
		for (int i = p >> 1;i < p;i ++) w[i] = (2 * w[i] - r[i] + mod) % mod;
	}
	cpy(f,w,m + 1),clr(sav,n + n),clr(w,n + n),clr(r,n + n);
}
int f[N];
signed main(){
	int n;
	cin >> n;
	for (int i = 0;i <= n;i ++) read(f[i]);
	invp(f,n),printp(f,n);
	return 0;
}
posted @ 2026-02-27 22:28  high_skyy  阅读(2)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end