• 【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
    ",e[i].r-e_[n-i].r);
    55     return 0;
    56 }
    View Code
  • 相关阅读:
    VFP正则表达式判断是否是手机号码/电子邮件
    VFP自定义函数StringFormat (仿.NET String.Format 方法)
    解决SOAPCLIENT访问WebSerivce外网发布端口
    VFP调用SOAPTOOLKIT 低级API
    经典的Hello World VFP前端调后端C# Webservice
    VFP不同句柄 同一事务处理 统一提交或回滚
    C++文件(夹)选择对话框操作
    Linxu之rz和sz命令
    测试标题
    自定义Silverlight TextBox 具有下拉框提示控件
  • 原文地址:https://www.cnblogs.com/JSL2018/p/6803286.html
Copyright © 2020-2023  润新知