多项式求逆求助
查看原帖
多项式求逆求助
114153
Saliеri楼主2020/6/6 09:57

一旦系数大了就有锅

#include <cstdio>
#define int long long
const int maxn = 4e5+5,mod = 998244353,G = 3;
inline void swap(int &a,int &b){a ^= b,b ^= a,a ^= b;}
inline int re(){
	char c;
	while((c=getchar())>'9'||c<'0');
	int res = c-'0';
	while((c=getchar())>='0'&&c<='9')res = res*10+c-'0';
	return res;
}
inline void print(int x){
	int temp = x/10;
	if(temp)print(temp);
	putchar(x-10*temp+'0');
}
inline void inpoly(int *F,int len){for(int i=0;i<=len;++i)F[i] = re();}
inline void printpoly(int *F,int len){
	for(int i=0;i<=len;++i)print(F[i]),putchar(' ');
	putchar('\n');
}
inline int KSM(int a,int x){
	int ans=1,base=a;
	while(x){
		if(x & 1)ans = ans*base%mod;
		base = base*base%mod;
		x >>= 1;
	}
	return ans;
}
inline void mst(int *F,int val,int len){for(register int i=0;i<len;++i)F[i] = val;}
inline void mpy(int *F,int *G,int len){for(register int i=0;i<len;++i)F[i] = G[i];}
const int INVG = KSM(G,mod-2);
int n,rev[maxn];
int f[maxn],g[maxn],temp1[maxn],temp2[maxn];
inline void grev(int len){for(int i=0;i<len;++i)rev[i] = (rev[i>>1]>>1 | ((i&1)?len>>1:0));}
inline void SWAP(int *F,int len){for(int i=0;i<len;++i)if(rev[i]<i)swap(F[rev[i]],F[i]);}
inline void NTT(int *F,int flag,int len){
	grev(len),SWAP(F,len);
	for(int merl = 1;merl < len;merl <<= 1){
		int dwg = KSM(flag?INVG:G,(mod-1)/(merl<<1));
		for(int st=0;st<len;st+=(merl<<1)){
			int buf = 1;
			for(int l=st;l<st+merl;++l){
				int temp = F[l+merl]*buf%mod;
				F[l+merl] = F[l] - temp;
				if(F[l+merl] < 0)F[l+merl] += mod;
				F[l] = F[l] + temp;
				if(F[l] > mod)F[l] -= mod;
				buf = dwg*buf%mod;
			}
		}
	}
	if(flag){
		int invn = KSM(len,mod-2);
		for(int i=0;i<len;++i)F[i] = F[i]*invn%mod;
	}
}
inline void times(int *F,int *G,int len){for(int i=0;i<len;++i)F[i] = F[i]*G[i]%mod;}
inline void getinv(int *F,int len){
	g[0] = F[0];
	for(int L = 2;L <= len;L <<= 1){
		mpy(temp2,F,L);
		for(int i=0;i<(L>>1);++i)temp1[i] = (g[i]<<1)%mod;
		NTT(g,0,L<<1),NTT(temp2,0,L<<1);
		for(int i=0;i<(L<<1);++i)g[i] = g[i]*g[i]%mod*temp2[i]%mod;
		NTT(g,1,L<<1);
		for(int i=0;i<L;++i){
			temp1[i] -= g[i];
			if(temp1[i] < 0)temp1[i] += mod;
		} 
		mpy(g,temp1,L<<1);
		mst(temp1,0,L<<1),mst(temp2,0,L<<1);
	}
	mpy(F,g,len),mst(g,0,len<<1),mst(temp1,0,len<<1),mst(temp2,0,len<<1);
}
signed main(){
	n = re(),--n;
	inpoly(f,n);
//	printpoly(f,n);
	int nn = n;
	for(n=1;n<=nn;n<<=1);
	getinv(f,n),getinv(f,n); 
	printpoly(f,nn);
	return 0;
} 


2020/6/6 09:57
加载中...