【模板】多項式乘法逆

D06發表於2024-07-10
  • 變數的值被莫名修改,往往是因為地址的傳遞導致兩個變數繫結在了一起
  • 怎樣搜尋替換double為long double呢?或許可以先轉化為long Double,再轉化為long double
點選檢視程式碼
#include <bits/stdc++.h>
using namespace std;
long long a[300005],tmp[300005];
long long f0[300005],m1[300005],m2[300005];
long long F[300005],G[300005];
const int mod=998244353;
long long read1()
{
	char cc=getchar();
	while(!(cc>=48&&cc<=57))
	{
		if(cc=='-')
		{
			break;
		}
		cc=getchar();
	}
	bool f=false;
	long long s=0;
	if(cc=='-')
	{
		f=true;
	}
	else
	{
		s=cc-48;
	}
	while(1)
	{
		cc=getchar();
		if(cc>=48&&cc<=57)
		{
			s=s*10+cc-48;
		}
		else
		{
			break;
		}
	}
	if(f==true)
	{
		s=-s;
	}
	return s;
}
long long power(long long n,long long p)
{
	if(p==0)
	{
		return 1;
	}
	else
	{
		long long tmp=power(n,p/2);
		long long ans=tmp*tmp%mod;
		if(p%2==1)
		{
			ans=ans*n%mod;
		}
		return ans;
	}
}
void FFT(long long *f,long long n,long long opt)
{
	if(n==1)
	{
		return;
	}
	for(long long i=0;i<n;i++)
	{
		tmp[i]=f[i];
	}
	for(long long i=0;i<n;i++)
	{
		if(i%2==0)
		{
			f[i/2]=tmp[i];
		}
		else
		{
			f[i/2+n/2]=tmp[i];
		}
	}
	long long *g=f,*h=f+n/2;
	FFT(g,n/2,opt);
	FFT(h,n/2,opt);
	long long cur=1,step;
	if(opt==1)
  	{
    	step=power(3,998244352/n);
    }
    else
    {
    	step=power(3,998244352-998244352/n);
    }
	for(long long i=0;i<n/2;i++)
	{
		tmp[i]=(g[i]+h[i]*cur%mod)%mod;
		tmp[i+n/2]=(g[i]-h[i]*cur%mod+mod)%mod;
		cur*=step;
		cur%=mod;
	}
	for(long long i=0;i<n;i++)
	{
		f[i]=tmp[i];
	}
}
void mul(long long*f,long long n,long long*g,long long m,long long *ans,long long maxn)
{
	/*
	for(long long i=0;i<n;i++)
	{
		for(long long j=0;j<m;j++)
		{
			if(i+j<maxn)
			{
				ans[i+j]+=(f[i]*g[j]);
			}
		}
	}
	*/
	long long tmp=ceil(log(n+m+2)/log(2));
	for(long long i=0;i<(1<<tmp);i++)
	{
		F[i]=0;
		if(i<n)
		{
			F[i]=f[i];
		}
	}
	for(long long i=0;i<(1<<tmp);i++)
	{
		G[i]=0;
		if(i<m)
		{
			G[i]=g[i];
		}
	}
	FFT(F,(1<<tmp),1);
	FFT(G,(1<<tmp),1);
	for(long long i=0;i<(1<<tmp);i++)
	{
		F[i]*=G[i];
		F[i]%=mod;
	}
	FFT(F,(1<<tmp),-1);
	int p=power((1<<tmp),998244351);
	for(long long i=0;i<maxn;i++)
	{
		ans[i]=F[i]*p%mod;
	}
}
void solve(long long n,long long *f0)
{
	if(n==1)
	{
		f0[0]=power(a[0],998244351);
		return;
	}
	solve((n+1)/2,f0);
	for(long long i=0;i<n;i++)
	{
		m1[i]=0;
	}
	mul(f0,(n+1)/2,f0,(n+1)/2,m1,n);
	for(long long i=0;i<n;i++)
	{
		m2[i]=0;
	}
	mul(m1,n,a,n,m2,n);
	for(long long i=(n+1)/2;i<n;i++)
	{
		f0[i]=(-m2[i]+mod)%mod;
	}
}
int main()
{
	long long n;
	cin>>n;
	for(long long i=0;i<n;i++)
	{
		a[i]=read1();
	}
	solve(n,f0);
	for(long long i=0;i<n;i++)
	{
		printf("%lld ",f0[i]);
	}
	cout<<endl;
	return 0;
}

相關文章