重新改了下,再次求调
查看原帖
重新改了下,再次求调
553501
可爱的小棉羊楼主2024/3/13 17:19

可以过样例了。

我认为应该是主程序的问题

#include<bits/stdc++.h>
using namespace std;
const long long mod=998244353,g=3,ing=332748118;
long long fpow(long long a,long long b){
	long long ans=1;
	while(b){
		if(b&1)ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
}
long long b[2][400005],res[400005];
int t;
void ntt(long long* a,int n,bool fl){
	for(int i=0;i<n;i++)if(i<res[i])swap(a[i],a[res[i]]);
	for(int h=1;h<n;h<<=1){
		long long wn=fpow(fl? ing:g,(mod-1)/(h<<1));
		for(int i=0;i<n;i+=(h<<1)){
			long long w=1;
			for(int j=0;j<h;j++,w=(w*wn)%mod){
				long long x=a[j+i],y=w*a[j+i+h]%mod;
				a[j+i]=(x+y)%mod;
				a[i+j+h]=(x-y+mod)%mod;
			}
		}
	}
	if(fl==1){
		int in=fpow(n,mod-2);
		for(int i=0;i<n;i++)a[i]=a[i]*in%mod;
	}
	
}
int n;
long long a[400005];
int s,bas,k;

int main(){
	cin>>n;
	for(int i=0;i<n;i++)cin>>a[i];
	b[0][0]=fpow(a[0],mod-2);
	s=2;
	k=1;
	bas=1;
	n--;
	for(int i=1;i<s;i++)res[i]=(res[i>>1]>>1)|((i&1)<<(k-1));
	while(bas<=(n<<1)){
		memset(b[t^1],0,sizeof(b[t^1]));
		for(int i=0;i<bas;i++)b[t^1][i]=(b[t][i]<<1)%mod;
		
		ntt(b[t],s,0);
		ntt(a,s,0);
		for(int i=0;i<s;i++)b[t][i]=b[t][i]*b[t][i]%mod*a[i]%mod;
		ntt(b[t],s,1);
		ntt(a,s,1);
		for(int i=0;i<bas;i++)b[t^1][i]=(b[t^1][i]-b[t][i]+mod)%mod;
		s<<=1;
		bas<<=1;
		k++;
		t^=1;
		if(bas<=(n<<1))for(int i=1;i<s;i++)res[i]=(res[i>>1]>>1)|((i&1)<<(k-1));
	}
	for(int i=0;i<=n;i++)cout<<b[t][i]<<" ";
	
} 
2024/3/13 17:19
加载中...