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

    3527: [Zjoi2014]力

    Time Limit: 30 Sec  Memory Limit: 256 MBSec  Special Judge
    Submit: 2417  Solved: 1435
    [Submit][Status][Discuss]

    Description

    给出n个数qi,给出Fj的定义如下:
    令Ei=Fi/qi,求Ei.
     

    Input

    第一行一个整数n。
    接下来n行每行输入一个数,第i行表示qi。
    n≤100000,0<qi<1000000000
     
     

    Output

     n行,第i行输出Ei。与标准答案误差不超过1e-2即可。

    Sample Input

    5
    4006373.885184
    15375036.435759
    1717456.469144
    8514941.004912
    1410681.345880

    Sample Output

    -16838672.693
    3439.793
    7509018.566
    4595686.886
    10903040.872

    HINT

    Source

    仔细观察这个式子 前半部分的Ei很符合卷积的性质,但是后半部分看的十分不友善

    我们用f1[i]表示q[i],f2[i]表示q[n-i-1],a[i]表示(1.0/i/i);

    那么E[i]前半部分=sigma qj/(j-i)^2可以看做f1[i]*a[j-i],一个赤裸裸的卷积

    后半部分可以表示为f2[n-i-1]*a[j-i],只好像不像卷积啊,我们把f2[i]数组给反过来,这样和不就是一个定值了么

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    const double pi=acos(-1);
    inline int read(){
        int x=0;int f=1;char ch=getchar();
        while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
        while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    const int MAXN=1e6+10;
    typedef complex <double> E;
    E a[MAXN],f1[MAXN],f2[MAXN],w[MAXN];
    int L,H,R[MAXN];
    inline void FFT(E *a,int f){
        for(int i=0;i<L;i++){
            if(i<R[i]) swap(a[i],a[R[i]]);
        }
        for(int len=2;len<=L;len<<=1){
            int l=len>>1;
            E wn(cos(pi/l),f*sin(pi/l));
            for(int i=1;i<l;i++) w[i]=w[i-1]*wn;
            for(int st=0;st<L;st+=len){
                for(int k=0;k<l;k++){
                    E x=a[st+k];E y=w[k]*a[st+l+k];
                    a[st+k]=x+y;a[st+k+l]=x-y;
                }
            }
        }
        if(f==-1){
            for(int i=0;i<L;i++){
                a[i]/=L;
            }
        }
    }
    int main(){
        int n=read();w[0].real()=1;
        for(int i=0;i<n;i++){
            scanf("%lf",&f1[i].real());
            f2[n-i-1]=f1[i];
        }
        for(int i=1;i<=n;i++){
            a[i]=(1.0/i/i);
        }
        L=1;
        while(L<=n+n) L<<=1,H++;
        for(int i=0;i<L;i++){
            R[i]=(R[i>>1]>>1)|((i&1)<<(H-1));
        }
        FFT(f1,1);FFT(a,1);FFT(f2,1);
        for(int i=0;i<L;i++){
            f1[i]=f1[i]*a[i];
            f2[i]=f2[i]*a[i];
        }
        FFT(f1,-1);FFT(f2,-1);
        for(int i=0;i<n;i++){
            printf("%.3lf
    ",f1[i].real()-f2[n-i-1].real());
        }
        return 0;
    }
    

      

  • 相关阅读:
    Applied Nonparametric Statistics-lec2
    Applied Nonparametric Statistics-lec1
    pandas-Notes2
    pandas-Notes1
    软件项目-软件项目开发各阶段文档模板(参考)
    项目管理-一个项目的完整过程
    腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面
    从新手到架构师,一篇就够:从100到1000万高并发的架构演进之路
    新手入门:零基础理解大型分布式架构的演进历史、技术原理、最佳实践
    我的常用网站
  • 原文地址:https://www.cnblogs.com/something-for-nothing/p/7898684.html
Copyright © 2011-2022 走看看