题目链接
- 变量的值被莫名修改,往往是因为地址的传递导致两个变量绑定在了一起
- 怎样搜索替换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;
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;
}