题目描述

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

输入

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

输出

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

样例输入

5
4006373.885184
15375036.435759
1717456.469144
8514941.004912
1410681.345880

样例输出

-16838672.693
3439.793
7509018.566
4595686.886
10903040.872
 
将$q_{j}$移到等式左边,可以得到:$E_{k}=\sum\limits_{i<k}^{ }\frac{q_{i}}{(i-k)^2}-\sum\limits_{i>k}^{ }\frac{q_{i}}{(i-k)^2}$
将等式右边分成两部分看。
对于第一部分设$j=k-i$,可以得到:$E_{k}'=\sum\limits_{i+j==k}^{ }q_{i}*\frac{1}{j^2}$,设$F(i)=q_{i},G(i)=\frac{1}{i^2},H(i)=E_{i}'$,将$F$和$G$卷积即可得到$H$。
对于第二部分设$j=i-k$,可以得到:$E_{k}''=\sum\limits_{i-j==k}^{ }q_{i}*\frac{1}{j^2}$,即$E_{k}''=\sum\limits_{j+n-i+1==n-k+1}^{ }q_{i}*\frac{1}{j^2}$。
将$n-k+1$和$n-i+1$看作新的$k$和$i$,也就是将第一部分中的$H$和$F$翻转,然后再卷积即可。即$F(n-i+1)=q_{i},H(n-i+1)=E_{i}''$。
将两部分对应做减法即可。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<cstdio>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const double pi=acos(-1.0);
struct lty
{
double x,y;
lty(double X=0,double Y=0){x=X,y=Y;}
}f[400000],g[400000],h[400000];
int n,mask=1;
double ans[400000];
double q[400000];
lty operator +(lty a,lty b){return lty(a.x+b.x,a.y+b.y);}
lty operator -(lty a,lty b){return lty(a.x-b.x,a.y-b.y);}
lty operator *(lty a,lty b){return lty(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
void DFT(lty *a,int len)
{
for(int i=0,k=0;i<len;i++)
{
if(i>k)
{
swap(a[i],a[k]);
}
for(int j=len>>1;(k^=j)<j;j>>=1);
}
for(int k=2;k<=len;k<<=1)
{
int t=k>>1;
lty x(cos(pi/t),sin(pi/t));
for(int i=0;i<len;i+=k)
{
lty w(1,0);
for(int j=i;j<i+t;j++)
{
lty res=a[j+t]*w;
a[j+t]=a[j]-res;
a[j]=a[j]+res;
w=w*x;
}
}
}
}
void IDFT(lty *a,int len)
{
for(int i=0,k=0;i<len;i++)
{
if(i>k)
{
swap(a[i],a[k]);
}
for(int j=len>>1;(k^=j)<j;j>>=1);
}
for(int k=2;k<=len;k<<=1)
{
int t=k>>1;
lty x(cos(pi/t),-1.0*sin(pi/t));
for(int i=0;i<len;i+=k)
{
lty w(1,0);
for(int j=i;j<i+t;j++)
{
lty res=a[j+t]*w;
a[j+t]=a[j]-res;
a[j]=a[j]+res;
w=w*x;
}
}
}
for(int i=0;i<len;i++)
{
a[i].x=a[i].x/len;
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lf",&q[i]);
}
while(mask<=(n<<1))
{
mask<<=1;
}
for(int i=1;i<=n;i++)
{
f[i].x=q[i];
}
for(int i=1;i<=n;i++)
{
g[i].x=(double)1/((double)i*i);
}
DFT(f,mask);
DFT(g,mask);
for(int i=0;i<mask;i++)
{
h[i]=g[i]*f[i];
}
IDFT(h,mask);
for(int i=1;i<=n;i++)
{
ans[i]=h[i].x;
}
for(int i=0;i<mask;i++)
{
f[i].x=f[i].y=0;
g[i].x=g[i].y=0;
}
for(int i=1;i<=n;i++)
{
f[i].x=q[n-i+1];
}
for(int i=1;i<=n;i++)
{
g[i].x=(double)1/((double)i*i);
}
DFT(f,mask);
DFT(g,mask);
for(int i=0;i<mask;i++)
{
h[i]=g[i]*f[i];
}
IDFT(h,mask);
for(int i=1;i<=n;i++)
{
ans[i]-=h[n-i+1].x;
}
for(int i=1;i<=n;i++)
{
printf("%.3f\n",ans[i]);
}
}

BZOJ3527[Zjoi2014]力——FFT的更多相关文章

  1. bzoj3527: [Zjoi2014]力 fft

    bzoj3527: [Zjoi2014]力 fft 链接 bzoj 思路 但是我们求得是 \(\sum\limits _{i<j} \frac{q_i}{(i-j)^2}-\sum_{i> ...

  2. [BZOJ3527][ZJOI2014]力 FFT+数学

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3527 首先卷积的形式是$h(i)=\sum_{i=0}^jf(i)g(i-j)$,如果我们 ...

  3. [bzoj3527][Zjoi2014]力_FFT

    力 bzoj-3527 Zjoi-2014 题目大意:给定长度为$n$的$q$序列,定义$F_i=\sum\limits_{i<j}\frac{q_iq_j}{(i-j)^2}-\sum\lim ...

  4. 【BZOJ-3527】力 FFT

    3527: [Zjoi2014]力 Time Limit: 30 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 1544  Solved: 89 ...

  5. 【BZOJ】3527: [Zjoi2014]力 FFT

    [参考]「ZJOI2014」力 - FFT by menci [算法]FFT处理卷积 [题解]将式子代入后,化为Ej=Aj-Bj. Aj=Σqi*[1/(i-j)^2],i=1~j-1. 令f(i)= ...

  6. P3338 [ZJOI2014]力(FFT)

    题目 P3338 [ZJOI2014]力 做法 普通卷积形式为:\(c_k=\sum\limits_{i=1}^ka_ib_{k-i}\) 其实一般我们都是用\(i=0\)开始的,但这题比较特殊,忽略 ...

  7. 【bzoj3527】[Zjoi2014]力 FFT

    2016-06-01  21:36:44 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3527 我就是一个大傻叉 微笑脸 #include&l ...

  8. bzoj3527: [Zjoi2014]力 卷积+FFT

    先写个简要题解:本来去桂林前就想速成一下FFT的,结果一直没有速成成功,然后这几天断断续续看了下,感觉可以写一个简单一点的题了,于是就拿这个题来写,之前式子看着别人的题解都不太推的对,然后早上6点多推 ...

  9. 2019.02.28 bzoj3527: [Zjoi2014]力(fft)

    传送门 fftfftfft菜题. 题意简述:给一个数列aia_iai​,对于i=1→ni=1\rightarrow ni=1→n求出ansi=∑i<jai(i−j)2−∑i>jai(i−j ...

随机推荐

  1. 推荐三个 VSCode 摸鱼插件

    周三是一周中最难以度过的一天,离上个周末过去了两天,离下个周末也还有两天.为了让各位更好地搬(mo)砖(yu),今天给大家推荐三款效(mo)率(yu)工(shen)具(qi)! 一.听歌插件 1 功能 ...

  2. 多态以及 LeetCode 每日一题

    1 多态 1.1 多态性 Java 引用变量有两个类型:一个是编译时类型,一个是运行时类型.前者是代码中声明这个变量时的类型,后者是由实际对象的类型决定的.当编译类型和运行类型不一样时,产生多态. c ...

  3. QuickBI助你成为分析师——计算字段功能

    摘要: 在用户创建报表时,通过现有字段数据不能直接满足展示需求,需要进行一定建模操作.目前产品支持在数据集编辑界面进行初步建模,下面主要介绍新建字段功能,以达到展示需求. 在用户创建报表时,有时通过现 ...

  4. 深挖 NPM 机制

    使用NPM安装的时候会经常出现包冲突(比如多个主模块的子模块版本不一致等),导致在开发过程中会遇到各种或大或小的问题.所有在这会介绍以下内容: NPM 主要安装方式 NPM 包信息查询 NPM 安装机 ...

  5. android添加阴影

    android底部增加背景 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns: ...

  6. Python正则表达式很难?一篇文章搞定他,不是我吹!

    1. 正则表达式语法 1.1 字符与字符类 1 特殊字符:.^$?+*{}| 以上特殊字符要想使用字面值,必须使用进行转义 2 字符类 1. 包含在[]中的一个或者多个字符被称为字符类,字符类在匹配时 ...

  7. Linq语法常见普通语法

    闲言碎语 近期比较忙,但还是想写点什么,就分享一些基础的知识给大家看吧,希望能帮助一些linq新手,如果有其它疑问,可以进右上角群,进行交流探讨,谢谢. 开门见山 读这篇文章之前,我先说下,每一种搜索 ...

  8. Linux学习历程——Centos 7 passwd命令

    一.命令介绍 passwd 命令用于修改用户密码,过期时间,认证信息等. 普通用户只能使用 passwd 命令修改自身的系统密码,而 root 管理员则有权限修改其他所有人的密码.更酷的是,root ...

  9. ES6的Map如何遍历

    projectMap.forEach(function (value, key, map) { //value和key就是map的key,value,map是map本身 });

  10. [十二省联考2019]D1T1异或粽子

    嘟嘟嘟 做这题之前,强烈推荐先把这道题切了P1631序列合并. 这两道题思路基本一模一样. 首先把异或处理成前缀异或,然后维护一个大根堆,每一次取出堆顶加到答案里面,然后把堆顶所在元素的次大的异或值放 ...