码迷,mamicode.com
首页 > 其他好文 > 详细

[ZJOI2014]力

时间:2017-08-14 20:01:40      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:class   str   分享   name   printf   double   code   src   for   

题目描述

技术分享

 

输入输出格式

输入格式:

第一行一个整数n。

接下来n行每行输入一个数,第i行表示qi。

输出格式: 

n行,第i行输出Ei。

与标准答案误差不超过1e-2即可。

输入输出样例

输入样例#1:
5
4006373.885184
15375036.435759
1717456.469144
8514941.004912
1410681.345880
输出样例#1:
-16838672.693
3439.793
7509018.566
4595686.886
10903040.872

说明

对于30%的数据,n≤1000。

对于50%的数据,n≤60000。

对于100%的数据,n≤100000,0<qi<1000000000。

题解:

E[i]=∑q[j]/(i-j)^2-∑q[j]/(j-i)^2

令g[i]=1/(i^2) 

E[i]=∑q[j]*g[i-j]-∑q[j]*g[j-i]

 ∑q[j]*g[i-j]是卷积形式,求出x^i的系数就行

∑q[j]*g[j-i]        (i<j<=n)

=∑q[j+i]*g[j]        (i<j+i<=n)=>(0<j<=n-i)

翻转q得到p[n-i]=q[i],t=n-i

=∑q[j+i]*g[j]=∑p[n-i-j]*g[j]=∑q[t-j]*g[j]         (0<j<=t)

∑q[t-j]*g[j]      (0<j<=t)是卷积形式,求出x^(n-i)的系数就行

 

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cmath>
  6 using namespace std;
  7 double pi=acos(-1.0);
  8 const int N=400001;
  9 struct Complex
 10 {
 11     double r,i;
 12     Complex (double r=0,double i=0):r(r),i(i){};
 13     Complex operator+(const Complex &x)
 14     {
 15         return Complex(r+x.r,i+x.i);
 16     }
 17     Complex operator-(const Complex &x)
 18     {
 19         return Complex(r-x.r,i-x.i);
 20     }
 21     Complex operator*(const Complex &x)
 22     {
 23         return Complex(r*x.r-i*x.i,i*x.r+x.i*r);
 24     }
 25 }A[N],B[N],C[N];
 26 int n,len;
 27 double p[N],q[N],g[N],ans[N];
 28 void rader(Complex F[],int len)
 29 {int i;
 30     int j=len/2;
 31     for (i=1;i<len-1;i++)
 32     {
 33         if (i<j)swap(F[i],F[j]);
 34          int k=len/2;
 35          while (j>=k)
 36          {
 37             j-=k;
 38             k/=2;
 39          }
 40          if (j<k) j+=k;
 41     }
 42 }
 43 void FFT(Complex F[],int len,int t)
 44 {int i,j,k;
 45     rader(F,len);
 46     for (i=2;i<=len;i=i*2)
 47     {
 48         Complex wn;
 49         wn.r=cos(t*2*pi/i);wn.i=sin(t*2*pi/i);
 50         for (j=0;j<len;j+=i)
 51         {
 52             Complex E;
 53             E.r=1;E.i=0;
 54              for (k=j;k<j+i/2;k++)
 55               {
 56                     Complex u=F[k];
 57                     Complex v=E*F[k+i/2];
 58                 F[k]=u+v;
 59                 F[k+i/2]=u-v;
 60                 E=E*wn;
 61               }
 62         }
 63     }
 64     if (t==-1)
 65      for (i=0;i<len;i++)
 66       F[i].r/=len;
 67 }
 68 int main()
 69 {int i,j;
 70     cin>>n;
 71      for (i=1;i<=n;i++)
 72      {
 73         scanf("%lf",&q[i]);
 74      }
 75      for (i=1;i<=n;i++)
 76      p[i]=q[n-i];
 77      p[0]=q[n];
 78      for (i=1;i<=n;i++)
 79      g[i]=1.0/((double)i*i);
 80      
 81      len=1;
 82      while (len<2*n) len*=2;
 83      for (i=0;i<len;i++)
 84      A[i].r=q[i],B[i].r=g[i];
 85      FFT(A,len,1);FFT(B,len,1);
 86      for (i=0;i<len;i++)
 87      C[i]=A[i]*B[i];
 88      FFT(C,len,-1);
 89      for (i=0;i<=n;i++)
 90       ans[i]=C[i].r;
 91     memset(A,0,sizeof(A));
 92     memset(B,0,sizeof(B));
 93     memset(C,0,sizeof(C));
 94     
 95       for (i=0;i<len;i++)
 96       A[i].r=p[i],B[i].r=g[i];
 97     FFT(A,len,1);FFT(B,len,1);
 98      for (i=0;i<len;i++)
 99      C[i]=A[i]*B[i];
100      FFT(C,len,-1);
101      for (i=0;i<=n;i++)
102      ans[i]-=C[n-i].r;
103     for (i=1;i<=n;i++)
104      printf("%.3lf\n",ans[i]);
105 }

 

[ZJOI2014]力

标签:class   str   分享   name   printf   double   code   src   for   

原文地址:http://www.cnblogs.com/Y-E-T-I/p/7359663.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!