请问第一篇题解中的reverse
查看原帖
请问第一篇题解中的reverse
128591
Refined_heart楼主2020/8/13 15:18

代码中 NTT 最后的逆变换中有一个 reverse 数组的操作,蒟蒻没有看懂为什么要反转,求指教(以及为什么从11开始反转)

#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
const int g=3;
const int N=2100000;
int n,a[N],b[N],c[N],rev[N];
inline int add(int x,int y){return (x+y)%mod;}
inline int mul(int x,int y){return 1ll*x*y%mod;}
inline int qpow(int a,int b){
	int res=1;
	while(b){
		if(b&1)res=mul(res,a);
		a=mul(a,a);b>>=1;
	}
	return res;
}
void NTT(int *a,int n,int x){
	for(int i=0;i<n;++i)if(i<rev[i])swap(a[i],a[rev[i]]);
	for(int i=1;i<n;i<<=1){
		int gn=qpow(g,(mod-1)/(i<<1));
		for(int j=0;j<n;j+=(i<<1)){
			int G=1,x,y;
			for(int k=0;k<i;++k,G=1ll*G*gn%mod){
				x=a[j+k],y=mul(G,a[i+j+k]);
				a[j+k]=add(x,y);a[i+j+k]=add(x,mod-y);
			}
		}
	}
	if(x==1)return;
	int inv=qpow(n,mod-2);reverse(a+1,a+n);//this
	for(int i=0;i<n;++i)a[i]=mul(a[i],inv); 
}
void Getinv(int deg,int *a,int *b){
	if(deg==1){b[0]=qpow(a[0],mod-2);return;}
	Getinv((deg+1)>>1,a,b);
	int len=0,lim=1;
	while(lim<(deg<<1))lim<<=1,++len;
	for(int i=1;i<lim;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<(len-1));
	for(int i=0;i<deg;++i)c[i]=a[i];
	for(int i=deg;i<lim;++i)c[i]=0;
	NTT(c,lim,1);NTT(b,lim,1);
	for(int i=0;i<lim;++i)b[i]=1LL*(2-1LL*c[i]*b[i]%mod+mod)%mod*b[i]%mod;
	NTT(b,lim,-1);
	for(int i=deg;i<lim;++i)b[i]=0;
}
int main(){
	scanf("%d",&n);
	for(int i=0;i<n;++i)scanf("%d",&a[i]);
	Getinv(n,a,b);
	for(int i=0;i<n;++i)printf("%d ",b[i]);
	return 0;
} 
2020/8/13 15:18
加载中...