首页 写随笔

cdcq(本博客废弃!现用博客:https://www.cnblogs.com/cdcq/)

本博客废弃!现用博客:https://www.cnblogs.com/cdcq/

导航

【BZOJ3527】【ZJOI2014】力

"FFT还不是随手写?"我终于能说这样的话了இwஇ

原题:

给出n个数qi,给出Fj的定义如下:
令Ei=Fi/qi,求Ei.
 
FFT嘛,直接推公式

然后就变成俩卷积了,FFT即可

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 int rd(){int z=0,mk=1;  char ch=getchar();
 8     while(ch<'0'||ch>'9'){if(ch=='-')mk=-1;  ch=getchar();}
 9     while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0';  ch=getchar();}
10     return z*mk;
11 }
12 struct cp{
13     double r,i;
14     cp(double _r=0,double _i=0):  r(_r),i(_i){}
15     cp operator+(cp x){return cp(r+x.r,i+x.i);}
16     cp operator-(cp x){return cp(r-x.r,i-x.i);}
17     cp operator*(cp x){return cp(r*x.r-i*x.i,r*x.i+i*x.r);}
18 };
19 int n;
20 cp a[410000],a_[410000],b[410000],tmp[410000],_x,_y;
21 cp e[410000],e_[410000];
22 int rvs[410000],dg[32],N,L;
23 void fft(cp x[],int mk){
24     for(int i=0;i<N;++i)  tmp[i]=x[rvs[i]];
25     for(int i=0;i<N;++i)  x[i]=tmp[i];
26     for(int i=2;i<=N;i<<=1){
27     cp wn(cos(2*M_PI/i),mk*sin(2*M_PI/i));
28     for(int k=0;k<N;k+=i){
29         cp w(1,0);
30         for(int j=k;j<k+(i>>1);++j){
31         _x=x[j],_y=x[j+(i>>1)]*w;
32         x[j]=_x+_y,x[j+(i>>1)]=_x-_y;
33         w=w*wn;
34         }
35     }
36     }
37     if(mk==-1)  for(int i=0;i<N;++i)  x[i].r/=N;
38 }
39 int main(){//freopen("ddd.in","r",stdin);
40     cin>>n;  n--;
41     double x;
42     for(int i=0;i<=n;++i)  scanf("%lf",&x),a[i]=cp(x);
43     for(int i=0;i<=n;++i)  a_[i]=a[n-i];
44     for(N=1,L=0;N<=(n+1);N<<=1,++L);  N<<=1,++L;
45     for(int i=0;i<N;++i){
46     for(int j=i,k=0;j;j>>=1,++k)  dg[k]=j&1;
47     for(int j=0;j<L;++j)  rvs[i]=(rvs[i]<<1)|dg[j];
48     }
49     for(int i=1;i<=n;++i)  b[i]=cp((double)1/i/i);
50     fft(a,1),fft(a_,1),fft(b,1);
51     for(int i=0;i<N;++i)  e[i]=a[i]*b[i];
52     for(int i=0;i<N;++i)  e_[i]=a_[i]*b[i];
53     fft(e,-1),fft(e_,-1);
54     for(int i=0;i<=n;++i)  printf("%.3lf\n",e[i].r-e_[n-i].r);
55     return 0;
56 }
View Code

 

posted on 2017-05-03 18:22  cdcq_old  阅读(199)  评论(0编辑  收藏  举报