Description
对 ,求的值。
当两边同时加上j时,仍不变。
我们规定
因为
不妨令,那么左边变成了卷积形式。现在来看右边。
设,我们引入一个的反转后的多项式,即让。
至此,两边都是卷积形式,可以直接FFT。
Code:
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
#define R register
const int N=1e5+9;
const double pi=3.1415926535898;
struct complex
{
complex(double xx=0,double yy=0){x=xx,y=yy;}
double x,y;
};
complex operator + (complex a,complex b){return complex(a.x+b.x,a.y+b.y);}
complex operator - (complex a,complex b){return complex(a.x-b.x,a.y-b.y);}
complex operator * (complex a,complex b){return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
complex a[N],b[N],c[N];
int r[N],l,m=1;
inline int read()
{
int res=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
res=(res<<1)+(res<<3)+ch-'0';
ch=getchar();
}
return res*f;
}
int n;
inline void FFT(complex *f,int op)
{
for(R int i=0;i<m;++i) if(i<r[i]) swap(f[i],f[r[i]]);
for(R int mid=1;mid<m;mid<<=1)
{
complex Wn=complex(cos(pi/mid),op*sin(pi/mid));
for(R int rr=mid<<1,i=0;i<m;i+=rr)
{
complex w=complex(1,0);
for(R int k=0;k<mid;k++,w=w*Wn)
{
complex X=f[k+i],Y=f[k+mid+i]*w;
f[k+i]=X+Y;
f[k+i+mid]=X-Y;
}
}
}
if(op==-1) for(int i=0;i<m;i++) f[i].x/=m;
}
int main()
{
n=read();
for(R int i=1;i<=n;++i)
{
scanf("%lf",&a[i].x);
c[n-i].x=a[i].x;
b[i].x=(double)(1.0/i/i);
}
while(m<=(n<<1)) ++l,m<<=1;
for(R int i=0;i<m;++i) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
FFT(a,1);
FFT(b,1);
FFT(c,1);
for(R int i=0;i<m;i++) a[i]=a[i]*b[i],c[i]=c[i]*b[i];
FFT(a,-1);FFT(c,-1);
for(R int i=1;i<=n;++i)
printf("%.3lf\n",a[i].x-c[n-i].x);
return 0;
}