1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| #pragma GCC optimize("-O3") #pragma GCC optimize("-Ofast") #pragma GCC optimize("-funroll-loops") #pragma GCC optimize("-ffast-math") #include <cstdio> #include <cmath> #include <cctype> #include <algorithm>
const double Pi=acos(-1.0); const int maxn=4e5+100;
double q[maxn]; int limit=1,rev[maxn];
struct Complex { double real,imag; Complex(double real,double imag):real(real),imag(imag){} Complex(){} Complex conj(); }w[maxn],winv[maxn],A[maxn],B[maxn],C[maxn];
inline Complex Complex::conj(){return Complex(real,-imag);} inline Complex operator+(const Complex& a,const Complex& b){return Complex(a.real+b.real,a.imag+b.imag);} inline Complex operator-(const Complex& a,const Complex& b){return Complex(a.real-b.real,a.imag-b.imag);} inline Complex operator*(const Complex& a,const Complex& b){return Complex(a.real*b.real-a.imag*b.imag,a.real*b.imag+a.imag*b.real);}
template<typename T> inline void swap(T& a,T& b){T t=a;a=b;b=t;}
inline void DFT(Complex* A,Complex* w,int limit) { for (register int i=0;i<limit;++i) if (i<rev[i]) swap(A[i],A[rev[i]]); for (register int mid=1;mid<limit;mid<<=1) for (register int R=mid<<1,j=0;j<limit;j+=R) for (register int k=0;k<mid;++k) { Complex x=A[j+k],y=w[limit/mid/2*k]*A[j+mid+k]; A[j+k]=x+y; A[j+mid+k]=x-y; } }
inline void prework(int n) { int l=0; while (limit<=(n<<1)+1) limit<<=1,++l; for (register int i=0;i<limit;++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1)); for (register int i=0;i<limit;++i) w[i]=Complex(cos(Pi*2/limit*i),sin(Pi*2/limit*i)),winv[i]=w[i].conj(); }
int main() { int n; scanf("%d",&n); for (int i=1;i<=n;++i) scanf("%lf",q+i),A[i].real=q[i]; prework(n); for (int i=1;i<=n;++i) B[i].real=1.0/i/i; DFT(A,w,limit);DFT(B,w,limit); static Complex G[maxn],H[maxn]; for (int i=0;i<limit;++i) G[i]=A[i]*B[i]; DFT(G,winv,limit); for (int i=0;i<limit;++i) G[i].real/=limit; std::reverse(q,q+n+1); for (int i=0;i<limit;++i) A[i]=Complex(q[i],0); DFT(A,w,limit); for (int i=0;i<limit;++i) H[i]=A[i]*B[i]; DFT(H,winv,limit); for (int i=0;i<limit;++i) H[i].real/=limit; for (int i=1;i<=n;++i) printf("%.5lf\n",G[i].real-H[n-i].real); }
|
v1.5.2