zoukankan      html  css  js  c++  java
  • 【BZOJ 3527】 3527: [Zjoi2014]力 (FFT)

     

     

     

    3527: [Zjoi2014]力

    Time Limit: 30 Sec  Memory Limit: 256 MBSec  Special Judge
    Submit: 2003  Solved: 1196

    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=Fi/qi

      所以$Ej=sum_{i<j} dfrac{qi}{(j-i)^2}-sum_{i>j} dfrac{qi}{(j-i)^2}+0(i=j)$

      容易看出,分子和分母的和是一样的(卷积)

      但是当i>j时系数是减,且这个下标是负号,怎么办呢?

      弄一个具体例子容易看出来:

      

      说明是负数的时候$F[i]=-dfrac{1}{i^2}$ 正数的时候$F[i]=dfrac{1}{i^2}$$F[0]=0$

      即$E[n]=sum A[i]*F[n-i]$,但这里的n-i可以为负,i从1到max,而不是1到n。

      所以把下标全部右移n位即可。

      即

      

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<cmath>
     7 using namespace std;
     8 #define Maxn 100000*8
     9 const double pi=acos(-1);
    10 
    11 struct P
    12 {
    13     double x,y;
    14     P() {x=y=0;}
    15     P(double x,double y):x(x),y(y){}
    16     friend P operator + (P x,P y) {return P(x.x+y.x,x.y+y.y);}
    17     friend P operator - (P x,P y) {return P(x.x-y.x,x.y-y.y);}
    18     friend P operator * (P x,P y) {return P(x.x*y.x-x.y*y.y,x.x*y.y+x.y*y.x);}
    19 }a[Maxn],b[Maxn];
    20 
    21 void fft(P *s,int n,int t)
    22 {
    23     if(n==1) return;
    24     P a0[n>>1],a1[n>>1];
    25     for(int i=0;i<=n;i+=2) a0[i>>1]=s[i],a1[i>>1]=s[i+1];
    26     fft(a0,n>>1,t);fft(a1,n>>1,t);
    27     P wn(cos(2*pi/n),t*sin(2*pi/n)),w(1,0);
    28     for(int i=0;i<(n>>1);i++,w=w*wn) s[i]=a0[i]+w*a1[i],s[i+(n>>1)]=a0[i]-w*a1[i];
    29 }
    30 
    31 int main()
    32 {
    33     int n,m;
    34     scanf("%d",&n);n--;
    35     m=2*n;
    36     for(int i=0;i<=n;i++) scanf("%lf",&a[i].x);
    37     for(int j=n;j>=1;j--) b[n-j].x=-1.0/j/j;
    38     b[n].x=0;
    39     for(int j=1;j<=n;j++) b[n+j].x=1.0/j/j;
    40     int nn=1;
    41     while(nn<n+m) nn<<=1;
    42     fft(a,nn,1);fft(b,nn,1);
    43     for(int i=0;i<=nn;i++) a[i]=a[i]*b[i];
    44     fft(a,nn,-1);
    45     for(int i=n;i<=n+n;i++) printf("%.3lf
    ",a[i].x/nn);
    46     return 0;
    47 }
    View Code

    2017-04-13 14:26:20

  • 相关阅读:
    Loadrunder脚本篇——Run-time Settings之Browser Enmulation
    loadrunner脚本篇——Run-time Settings之ContentCheck
    Loadrunder脚本篇——Running Time setting之Additional attributes
    Loadrunder脚本篇——Run-time Settings之Miscellaneous
    Loadrunder脚本篇——Run-time Settings之Preferences
    NOI08冬令营 数据结构的提炼与压缩
    Codeforces Round #250 (Div. 2)
    Codeforces 468D Tree
    初探 回文树
    二分图匹配的两个主要算法 模板
  • 原文地址:https://www.cnblogs.com/Konjakmoyu/p/6703752.html
Copyright © 2011-2022 走看看