玄关求调,码风良好
查看原帖
玄关求调,码风良好
542128
liyixin0514楼主2024/4/27 16:15

rt,已过样例。

MnZn 刚学模板,请各位大佬帮帮忙qwq,实在找不出问题了。\bx orz

#include<bits/stdc++.h>
#define sf scanf
#define pf printf
using namespace std;
typedef long long ll;
const int N=4e5+3,mod=998244353;
const int g=3;
int re[N];
int a[N],b[2][N];
int n,lim,len;
void reverse(int lim,int len){
	for(int i=1;i<lim;i++) re[i]=(re[i>>1]>>1)|((i&1)<<(len-1));
}
int add(int a,int b){
	a=a+b;
	if(a>=mod) a-=mod;
	return a;
}
int ksm(int a,int b){
	int s=1;
	while(b){
		if(b&1) s=1ll*s*a%mod;
		a=1ll*a*a%mod;
		b>>=1;
	}
	return s;
}
void NTT(int *c,int lim,int type){
	for(int i=0;i<lim;i++){
		if(i<re[i]) swap(c[i],c[re[i]]);
	}
	for(int mid=1;mid<lim;mid<<=1){
		int G=ksm(g,(mod-1)/(mid<<1));
		if(type==-1) G=ksm(G,mod-2);
		for(int r=mid<<1,j=0;j<lim;j+=r){
			int w=1;
			for(int i=0;i<mid;i++,w=1ll*w*G%mod){
				int a=c[j+i],b=1ll*c[j+mid+i]*w%mod;
				c[j+i]=add(a,b);
				c[j+mid+i]=add(a,mod-b);
			}
		}
	}
	if(type==-1){
		int inv=ksm(lim,mod-2);
		for(int i=0;i<lim;i++) c[i]=1ll*c[i]*inv%mod;
	}
}
void mul(int *a,int *b,int lim){
	int A[N],B[N];
	memset(A,0,sizeof(A));
	memset(B,0,sizeof(B));
	for(int i=0;i<lim;i++) A[i]=a[i],B[i]=b[i];
	NTT(A,lim,1);
	NTT(B,lim,1);
	for(int i=0;i<lim;i++) A[i]=1ll*A[i]*B[i]%mod;
	NTT(A,lim,-1);
	for(int i=0;i<lim;i++) a[i]=A[i];
}
void getinv(int *a,int &cur,int n){
	b[cur][0]=ksm(a[0],mod-2);
	int bas=1,lim=2,len=1;
	while(bas<=(n<<1)){
		reverse(lim,len);
		cur^=1;
		memset(b[cur],0,sizeof(b[cur]));
		for(int i=0;i<bas;i++){
			b[cur][i]=add(b[cur^1][i]<<1,0);
		}
		mul(b[cur^1],b[cur^1],lim);
		mul(b[cur^1],a,lim);
		for(int i=0;i<bas;i++){
			b[cur][i]=add(b[cur][i],mod-b[cur^1][i]);
		}
		bas<<=1,lim<<=1,++len;
	}
}
int main(){
	sf("%d",&n);
	for(int i=0;i<n;i++) sf("%d",&a[i]);
	int cur=0;
	getinv(a,cur,n);
	for(int i=0;i<n;i++) pf("%d ",b[cur][i]);
}
2024/4/27 16:15
加载中...