Description

Input

输入文件包含一个整数n,接下来n行每行输入一个数,第i行表示qi。

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

Data Constraint

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

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

对于100%的数据,n≤100000,0

Solution

  • 经典FFT……

  • 先推式子,化简一下 EiE_i ,得:

    Ej=∑i<jqi(j−i)2−∑i>jqi(i−j)2

    E_j=\sum_{ij}\frac{q_i}{(i-j)^2}

  • 可以发现前面和后面是差不多的,我们可以分开算。

  • 现在考虑前面,有:

    Pj=∑i<jqi(j−i)2

    P_j=\sum_{i

  • 令 ri=1i2r_i=\frac{1}{i^2} ,则有标准数论卷积的形式:

    Pj=∑i<jqi∗rj−i

    P_j=\sum_{i

  • 如此一来就可以直接用FFT加速计算了,时间复杂度 O(N log N)O(N\ log\ N) 。

  • 而后面部分就相当于把 q<script type="math/tex" id="MathJax-Element-533">q</script> 数组反过来做一遍即可。

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#include<cmath>
using namespace std;
const int N=1e5+5;
const double Pi=acos(-1.0);
struct comp
{double r,i;comp(){}comp(double rr,double ii){r=rr,i=ii;}comp operator +(const comp &x)const{return comp(r+x.r,i+x.i);}comp operator -(const comp &x)const{return comp(r-x.r,i-x.i);}comp operator *(const comp &x)const{return comp(r*x.r-i*x.i,i*x.r+r*x.i);}
}f1[N<<2],f2[N<<2],f3[N<<2];
int n,m;
int rev[N<<2];
double q[N];
inline double read()
{double X=0,Y=1.0; int w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=X*10+(ch^48),ch=getchar();ch=getchar();while(isdigit(ch)) X+=(Y/=10)*(ch^48),ch=getchar();return w?-X:X;
}
inline void FFT(comp *y,int ff)
{for(int i=0;i<m;i++)if(i<rev[i]) swap(y[i],y[rev[i]]);for(int h=2;h<=m;h<<=1){comp wn(cos(2*Pi/h),ff*sin(2*Pi/h));for(int i=0;i<m;i+=h){comp w(1,0);for(int k=i;k<i+h/2;k++){comp u=y[k],t=w*y[k+h/2];y[k]=u+t;y[k+h/2]=u-t;w=w*wn;}}}if(ff==-1) for(int i=0;i<m;i++) y[i].r/=m;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++) q[i]=read();int l=0;for(m=1;m<=n<<1;m<<=1) l++;for(int i=0;i<m;i++) rev[i]=rev[i>>1]>>1|(i&1)<<l-1;for(int i=1;i<=n;i++) f1[i]=comp(q[i],0);for(int i=1;i<=n;i++) f2[i]=comp(q[n-i+1],0);for(int i=1;i<=n;i++) f3[i]=comp(1.0/i/i,0);FFT(f1,1),FFT(f2,1),FFT(f3,1);for(int i=0;i<m;i++) f1[i]=f1[i]*f3[i];for(int i=0;i<m;i++) f2[i]=f2[i]*f3[i];FFT(f1,-1),FFT(f2,-1);for(int i=1;i<=n;i++) printf("%.3lf\n",f1[i].r-f2[n-i+1].r);return 0;
}

JZOJ 3617. 【ZJOI2014】力相关推荐

  1. BZOJ3527: [Zjoi2014]力

    BZOJ3527: [Zjoi2014]力 Description 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. Input 第一行一个整数n. 接下来n行每行输入一个数,第i行 ...

  2. P3338 [ZJOI2014]力(FFT)

    P3338 [ZJOI2014]力 Fj=∑i=1j−1qi×qj(i−j)2−∑i=j+1nqi×qj(i−j)2Ej=∑i=1j−1qi(i−j)2−∑i=j+1nqi(i−j)2f(i)=qi, ...

  3. P3338 [ZJOI2014]力 FFT + 推式子

    传送门 文章目录 题意: 思路: 题意: 思路: 这个式子看起来很FFTFFTFFT,让我们来化简一下. 考虑EEE中直接将qiq_iqi​约掉,所以Ei=∑j=1i−1qj(i−j)2−∑j=i+1 ...

  4. P3338 [ZJOI2014]力

    P3338 [ZJOI2014]力 卷积 + FFT 题意 思路 Code(921ms) 传送门: https://www.luogu.com.cn/problem/P3338 题意 Fj=∑i=1j ...

  5. P3338 [ZJOI2014]力 [FFT]

    P3338[ZJOI2014]力P3338 [ZJOI2014]力P3338[ZJOI2014]力 给出n个数qi,给出Fj的定义如下: Fj=∑i<jqiqj(i−j)2−∑i>jqiq ...

  6. [卷积系列] P3338 [ZJOI2014]力

    P3338 [ZJOI2014]力 Ej=Fjqj=∑i=1j−1qi(i−j)2−∑i=j+1nqi(i−j)2E_j= \frac{F_{j}}{q_{j}} =\sum_{i=1}^{j-1} ...

  7. 【BZOJ 3527】 [Zjoi2014]力

    3527: [Zjoi2014]力 Description 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. Input 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi ...

  8. BZOJ.3527.[ZJOI2014]力(FFT)

    题目链接 \(Descripiton\) 给出\(q[\ ]\),\[F[j]=\sum_{i<j}\frac{q_iq_j}{(i-j)^2}-\sum_{i>j}\frac{q_iq_ ...

  9. 【BZOJ】3527: [Zjoi2014]力(fft+卷积)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3527 好好的一道模板题,我自己被自己坑了好久.. 首先题目看错.......什么玩意.......首 ...

最新文章

  1. PCL:官方程序 Region growing segmentation
  2. win10 anaconda 下pcl库的安装
  3. android 序列化_Android高级架构进阶之数据传输与序列化
  4. 动态规划-背包问题小结
  5. tar中的zxvf都是什么?
  6. mysql_fetch_array 失败_无语的出错,mysql_fetch_array()
  7. 前端学习(1644):前端系列实战课程之上移和下移
  8. 世界之窗浏览器怎么隐藏收藏栏
  9. 剑指offer之矩阵中的最短路径
  10. 解决cacti创建ping主机时不出图的问题
  11. Mysql学习第一课-mysql的定义及sql语句
  12. 算法:在有序的链表中删除掉所有重复的数据(包括重复本身的节点)Remove Duplicates from Sorted List II
  13. 虚拟机linux装无线网卡驱动,linux无线网卡驱动安装
  14. android qq分享纯图片,手机照片批量上传QQ空间一键分享省流量
  15. Message: session not created: This version of ChromeDriver only supports Chrome version XX
  16. 易语言python识别图片验证码_图片识别-打码平台-打码网站-识别验证码-图鉴网络科技有限公司...
  17. 香港服务器部署网站慢,用香港云主机服务器网站慢怎么解决?
  18. kodi+java版_Emby+KODI--完美的NAS多媒体方案
  19. vba rnd_VBA Rnd()函数不正确,应使用什么代替
  20. matlab中 randperm()的用法

热门文章

  1. android中关于点击屏幕,实现破碎的效果的实现
  2. vivado实现基本D触发器
  3. 无功功率控制模式matlab,第9章_MATLAB在风力发电技术中的应用仿真.ppt
  4. [云炬创业管理笔记]第二章成为创业者讨论2
  5. 科大星云诗社动态20210514
  6. 浙大python判断两个字符串是否为变位词_python数据结构与算法 变位词
  7. 怎么把网页源码家入hexo博客_一款被大厂选用的 Hexo 博客主题
  8. OpenGL编程指南1:OpenGL简介
  9. 戏说 Windows GDI (3)
  10. 串口通信模块1:串口基础知识