[bzoj3527]力
http://blog.csdn.net/wzq_qwq/article/details/48155921
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 #include <cstdlib> 6 #include <string> 7 #include <vector> 8 #include <cmath> 9 #include <complex> 10 using namespace std; 11 12 const int N=1000000; 13 14 typedef complex<double> c; 15 c F[N],A[N],B[N]; 16 int n; 17 double q; 18 19 int rev(int x,int n){ 20 int ret=0; 21 for(int i=0;(1<<i)<n;i++)ret=(ret<<1)|((x&(1<<i))>0); 22 return ret; 23 } 24 25 void fft(c *a,int n,int f){ 26 for(int i=0;i<n;i++)F[rev(i,n)]=a[i]; 27 for(int i=2;i<=n;i*=2){ 28 c wn=c(cos(2*acos(-1)*f/i),sin(2*acos(-1)*f/i)); 29 for(int j=0;j<n;j+=i){ 30 c w=1; 31 for(int k=j;k<j+i/2;k++){ 32 c u=F[k],t=w*F[k+i/2]; 33 F[k]=u+t; 34 F[k+i/2]=u-t; 35 w*=wn; 36 } 37 } 38 } 39 for(int i=0;i<n;i++)a[i]=(F[i]/=(f==-1?n:1)); 40 } 41 42 int main() 43 { 44 scanf("%d",&n);n--; 45 for(int i=0;i<=n;i++)scanf("%lf",&q),A[i]=q; 46 for(int i=0;i<n;i++) 47 B[i]=(-1.0)/((double)(n-i)*(double)(n-i)); 48 for(int i=n+1;i<=2*n;i++) 49 B[i]=-B[2*n-i]; 50 int m=4*n,nn=n; 51 for(n=1;n<=m;n<<=1); 52 fft(A,n,1),fft(B,n,1); 53 for(int i=0;i<=n;i++)A[i]*=B[i]; 54 fft(A,n,-1); 55 for(int i=nn;i<=2*nn;i++)printf("%lf\n",A[i].real()); 56 }