悬赏至少三关注求调
查看原帖
悬赏至少三关注求调
701460
Magus楼主2025/1/26 11:25
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000005,p=998244353,g=3,ig=332748118;
int n,a[N],b[N],c[N],d[N],e[N],r[N];
int qpow(int a,int x)
{
	if(x==0)return 1;
	if(x==1)return a%p;
	int c=qpow(a,x/2),y=qpow(a,x%2);
	return c*y%p*c%p;
}
void NTT(int *a,int op,int t)
{
	for(int i=0;i<t;i++)if(i<r[i])swap(a[i],a[r[i]]);
	for(int i=1,x,y,r;i<t;i<<=1)
	{
		if(~op)r=qpow(g,(p-1)/(i<<1));
		else r=qpow(ig,(p-1)/(i<<1));
		for(int j=0;j<t;j+=(i<<1))for(int k=0,w=1;k<i;k++,w=w*r%p)
		{
			x=a[j+k];y=w*a[i+j+k]%p;
			a[j+k]=(x+y)%p;a[i+j+k]=(x-y+p)%p;
		}
	}
	if(!~op)
	{
		int inv=qpow(t,p-2);
		for(int i=0;i<t;i++)a[i]=a[i]*inv%p;
	}
}
void mul(int *a,int n,int *b,int m,int *c)
{
	int t=1,l=0;
	while(t<=n+m){l++;t<<=1;}
	for(int i=0;i<t;i++)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
	NTT(a,1,t);NTT(b,1,t);
	for(int i=0;i<t;i++)c[i]=a[i]*b[i]%p;
	NTT(c,-1,t);
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=0;i<n;i++){cin>>a[i];a[i]%=p;}
	b[0]=qpow(a[0],p-2);
	for(int i=1;i<n;i<<=1)
	{
		for(int j=0;j<2*i;j++)d[j]=a[j];
		for(int j=0;j<i;j++)e[j]=b[j];
		mul(d,2*i-1,b,i-1,c);
		for(int j=0;j<2*i;j++)c[j]=p-c[j];
		for(int j=2*i;j<n;j++)c[j]=0;
		(c[0]+=2)%=p;
		mul(e,i-1,c,2*i-1,b);
		for(int j=2*i;j<n;j++)b[j]=0;
	}
	for(int i=0;i<n;i++)cout<<b[i]<<' ';
}

样例最高项输出 1027,其他都是对的。

2025/1/26 11:25
加载中...