zoukankan      html  css  js  c++  java
  • BZOJ 3527 力

    fft推下公式。注意两点:

    (1)数组从0开始以避免出错。

    (2)i*i爆long long

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<complex>
    #define pi acos(-1)
    #define maxn 400500
    using namespace std;
    typedef complex<double> E;
    int n,r[maxn],m,l=0;
    double regis;
    E a1[maxn],a2[maxn],b[maxn],c1[maxn],c2[maxn];
    void reset()
    {
        for (int i=1;i<=(m/2);i++)
            b[i].real()=(1.0)/i/i;
    }
    void fft(E *x,int f)
    {
        for (int i=0;i<n;i++)
            if (i>r[i]) swap(x[i],x[r[i]]);
        for (int i=1;i<n;i<<=1)
        {
            E wn(cos(pi/i),f*sin(pi/i));
            for (int j=0;j<n;j+=(i<<1))
            {
                E w(1,0);
                for (int k=0;k<i;k++)
                {
                    E r1,r2;
                    r1=x[j+k];r2=w*x[i+j+k];
                    x[j+k]=r1+r2;x[i+j+k]=r1-r2;
                    w*=wn;
                }
            }
        }
        if (f==-1)
        {
            for (int i=0;i<n;i++)
                x[i]/=n;
        }
    }
    int main()
    {
        scanf("%d",&n);n--;
        for (int i=0;i<=n;i++)
        {
            scanf("%lf",&regis);
            a1[i].real()=a2[n-i].real()=regis;
        }
        m=2*n;
        for (n=1;n<=m;n<<=1) l++;
        for (int i=0;i<n;i++) r[i]=((r[i>>1]>>1)|((i&1)<<(l-1)));
        reset();
        fft(a1,1);fft(b,1);fft(a2,1);
        for (int i=0;i<n;i++)
        {
            c1[i]=a1[i]*b[i];
            c2[i]=a2[i]*b[i];
        }
        fft(c1,-1);fft(c2,-1);
        n=m/2;
        for (int i=0;i<=n;i++)
            printf("%.3lf
    ",c1[i].real()-c2[m/2-i].real());
        return 0;
    }
  • 相关阅读:
    Python之路Day02
    Python之路Day01
    Python 常用单词
    JS-向数组添加元素
    JS-lambda表达式
    正则表达式问记录
    JDBC学习
    jquery常用选择器
    mongodb学习
    java8 lambda表达式
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5769873.html
Copyright © 2011-2022 走看看