- 變數的值被莫名修改,往往是因為地址的傳遞導致兩個變數繫結在了一起
- 怎樣搜尋替換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;
}