求助
查看原帖
求助
310581
ethan0328楼主2024/5/19 19:12

这个题 TLE 了后面 55,求调。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e5+10,mod=998244353;
int n,n2,a[N],b[N],tr[N],t1[N],t2[N],t3[N];
int qpow(int x,int y)
{
	int ret=1;
	while(y)
	{
		if(y&1)
		{
			ret=ret*x%mod;
		}
		x=x*x%mod;
		y/=2;
	}
	return ret;
}
void ntt(int *ar,int len,int fl)
{
	int g=3,invg;
	invg=qpow(g,mod-2);
	for(int i=0;i<len;i++)
	{
		if(tr[i]>i)
		{
			swap(ar[i],ar[tr[i]]);
		}
	}
	for(int l=2;l<=len;l*=2)
	{
		int mid=l/2,W=qpow((fl==1? g:invg),(mod-1)/l),w=1;
		for(int i=0;i+l<=len;i+=l)
		{
			for(int j=i,w0=w;j<i+mid;j++,w0=w0*W%mod)
			{
				int x=ar[j],y=w0*ar[j+mid]%mod;
				ar[j]=(x+y);ar[j+mid]=(x-y+mod);
				if(ar[j]>mod)
				{
					ar[j]-=mod;
				}
				if(ar[j+mid]>mod)
				{
					ar[j+mid]-=mod;
				}
			}
		}
	}
}
void mul(int *x,int *y)
{
	for(int i=0;i<n;i++)
	{
		t1[i]=x[i];t2[i]=y[i];
	}
	ntt(t1,n,1);
	ntt(t2,n,1);
	for(int i=0;i<n;i++)
	{
		t1[i]=t1[i]*t2[i]%mod;
	}
	ntt(t1,n,-1);
	for(int i=0;i<n;i++)
	{
		x[i]=t1[i]*qpow(n,mod-2)%mod;
	}
}
void getinv()
{
	b[0]=qpow(a[0],mod-2);
	for(int i=2;i<=n;i*=2)
	{
		for(int j=0;j<i/2;j++)
		{
			t3[j]=b[j]*2;
			if(t3[j]>mod)
			{
				t3[j]-=mod;
			}
		}
		mul(b,b);
		mul(b,a);
		for(int j=0;j<i/2;j++)
		{
			b[j]=t3[j]-b[j]+mod;
			if(b[j]>mod)
			{
				b[j]-=mod;
			}
		}
		for(int j=i/2;j<n;j++)
		{
			b[j]=0;
		}
	}
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	int x;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	n2=n*2;n=1;x=0;
	while(n<=n2)
	{
		n*=2;
		x++;
	}
	n2/=2;
	for(int i=1;i<n;i++)
	{
		tr[i]=(tr[i>>1]>>1)|((i&1)<<(x-1));
	}
	getinv();
	for(int i=0;i<n2;i++)
	{
		cout<<b[i]<<" ";
	}
}
2024/5/19 19:12
加载中...