社区讨论

求助玄学T

P4238【模板】多项式乘法逆参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lo2ay5et
此快照首次捕获于
2023/10/23 10:52
2 年前
此快照最后确认于
2023/11/03 11:03
2 年前
查看原帖
常熟大的一批
重构五六遍了
code:
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int maxn = 4e5 + 10;
const int mod = 998244353, G = 3;

int N;
int f[maxn];
int h[30][maxn];

int k, siz;
int rev[maxn];

void init(){
	k = 1; siz = 0; while(k < (2*N + 1)) k <<= 1, siz++; k--;
	for (int i = 0; i <= k; i++) rev[i] = ((rev[i >> 1] >> 1) | ((i&1) << (siz-1)));
}

int fpow(int x, int y){
	int ans = 1;
	for (int bas = x; y; bas = (bas * bas) % mod, y >>= 1) if(y&1) ans = (ans * bas) % mod;
	return ans;
}

int inv(int x){ return fpow(x, mod-2);}

void ntt(int A[], int n, int isinv){
	for (int i = 0; i < n; i++) if(rev[i] < i) swap(A[i], A[rev[i]]);
	
	for (int len = 2, mid, step; len <= n; len <<= 1){
    	mid = (len >> 1);
		step = fpow((isinv == 1 ? G : inv(G)), (mod-1)/len);
		for (int j = 0, w, x, y; j < n; j += len){
			w = 1;
			for (int k = 0; k <= mid - 1; k++, w = w * step % mod){
				x = A[j + k]; y = w * A[j + k + mid] % mod;
				A[j + k] = (x + y) % mod; A[j + k + mid] = (x - y + mod) % mod;
			}
		}
	}
	
	if(isinv == -1) {
		int ni = inv(n);
		for (int i = 0; i < n; i++) A[i] = A[i] * ni % mod;
	}
}

void cpy(int A[], int B[], int n){
	for (int i = 0; i <= n; i++) A[i] = B[i];
	for (int i = n+1; i <= k; i++) A[i] = 0;
}

int x[maxn], y[maxn]; 
void mul(int A[], int B[], int n){
	cpy(x, A, n); cpy(y, B, n);
	ntt(x, n+1, 1); ntt(y, n+1, 1);
	for (int i = 0; i <= n; i++) x[i] = x[i] * y[i] %mod;
	ntt(x, n+1, -1);
	cpy(A, x, n);
}

signed main(){
	cin >> N; N--;
	for (int i = 0 ; i <= N; i++) cin >> f[i];
	
	init();
	
	h[0][0] = inv(f[0]);
	int cnt = 0;
	for (int z = 2, flg = 0; z <= N || flg == 0; z <<= 1){
		if(z > N) flg = 1;
		cnt++;
		cpy(h[cnt], h[cnt-1], ((z << 1) - 1));
		
		mul(h[cnt], f, k);
		
		for (int i = 0; i <= k; i++) h[cnt][i] = (mod - h[cnt][i]) % mod; h[cnt][0] += 2;
		
		mul(h[cnt], h[cnt-1], k);
		
		for (int i = z; i <= k; i++) h[cnt][i] = 0;
	}
	
	for (int i = 0; i <= N; i++) cout << h[cnt][i] <<" ";
	return 0;
} 

回复

4 条回复,欢迎继续交流。

正在加载回复...