求
Ej=∑i=0j−1qi(j−i)2−∑i=j+1n−1qi(i−j)2
设 Cj=∑i=0j−1qi(j−i)2,Dj=∑i=j+1n−1qi(i−j)2 ,则 Ej=Cj−Dj
令
ai=qi,ci=1i2(c0=0)
则
Cj=∑i=0j−1qi(j−i)2
Cj=∑i=0jai∗cj−i
就是个卷积可以fft求。
再看D这一部分
Dj=∑i=j+1n−1qi(i−j)2
Dj=∑i=jn−1ai∗ci−j
Dj=∑i=0n−1−jai+j∗ci
我们令 bi=an−1−i
则
Dj=∑i=0n−1−jbn−i−j−1∗ci=Pn−1−j
也是个卷积,倒过来就好了。
于是就是两个裸卷积。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <complex>
using namespace std;
#define N 270000
#define pi acos(-1)
typedef complex<double> E;
int n,m,L=0,R[N];
E a[N],b[N],c[N];
inline void fft(E *a,int f){
for(int i=0;i<n;++i) if(i<R[i]) swap(a[i],a[R[i]]);
for(int i=1;i<n;i<<=1){
E wn(cos(pi/i),f*sin(pi/i));
for(int p=i<<1,j=0;j<n;j+=p){
E w(1,0);
for(int k=0;k<i;++k,w*=wn){
E x=a[j+k],y=w*a[j+k+i];
a[j+k]=x+y;a[j+k+i]=x-y;
}
}
}if(f==-1) for(int i=0;i<n;++i) a[i]/=n;
}
int main(){
// freopen("a.in","r",stdin);
scanf("%d",&n);
for(int i=0;i<n;++i) scanf("%lf",&a[i]),b[n-1-i]=a[i];
for(int i=1;i<n;++i) c[i]=1.0/i/i;
m=n+n;for(n=1;n<=m;n<<=1) ++L;
for(int i=0;i<n;++i) R[i]=(R[i>>1]>>1)|(i&1)<<L-1;
fft(a,1);fft(c,1);fft(b,1);
for(int i=0;i<n;++i) a[i]*=c[i],b[i]*=c[i];
fft(a,-1);fft(b,-1);m>>=1;
for(int i=0;i<m;++i) printf("%.3lf\n",a[i].real()-b[m-1-i].real());
return 0;
}