题目链接
题解:
我们通过移向后,再将后面的式子翻转一下,就可以看到两个式子都是卷积的形式了。然后FFT套一下板子就过了。
#include <bits/stdc++.h>
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
const long double PI=acos(-1.0);
struct Complex{
long double x,y;
}A[500050],B[500050],C[500050];
Complex operator + (Complex a,Complex b)
{
return {a.x+b.x,a.y+b.y};
}
Complex operator - (Complex a,Complex b)
{
return {a.x-b.x,a.y-b.y};
}
Complex operator * (Complex a,Complex b)
{
return {a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};
}
int lim=1,l,r[4200000];
inline void FFT(Complex *A,int type)
{
for (int i=0;i<lim;i++) if (i<r[i]) swap(A[i],A[r[i]]);
for (int mid=1;mid<lim;mid<<=1){
Complex Wn={cos(PI/mid),type*sin(PI/mid)};
for (int j=0;j<lim;j+=(mid<<1)){
Complex W={1,0};
for (int k=0;k<mid;k++){
Complex x=A[j+k],y=W*A[j+mid+k];
A[j+k]=x+y;
A[j+mid+k]=x-y;
W=W*Wn;
}
}
}
}
int main()
{
int n=read();
for (int i=1;i<=n;i++){
scanf("%Lf",&A[i].x);
B[n+1-i].x=A[i].x;
}
for (int i=1;i<=n;i++) C[i].x=(1.0/(long double)i)/(long double)i;
while (lim<=2*n) {
lim<<=1;
l++;
}
for (int i=0;i<lim;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
FFT(A,1);
FFT(B,1);
FFT(C,1);
for (int i=0;i<=lim;i++){
A[i]=A[i]*C[i];
B[i]=B[i]*C[i];
}
FFT(A,-1);
FFT(B,-1);
for (int i=0;i<=lim;i++){
A[i].x/=lim;
B[i].x/=lim;
}
for (int i=1;i<=n;i++) printf("%.5Lf\n",A[i].x-B[n+1-i].x);
return 0;
}