先写个简要题解:本来去桂林前就想速成一下FFT的,结果一直没有速成成功,然后这几天断断续续看了下,感觉可以写一个简单一点的题了,于是就拿这个题来写,之前式子看着别人的题解都不太推的对,然后早上6点多推了一个多小时终于发现了一个很巧妙的方法,首先问题的关键在于后半个式子,因为显然前半个式子很容易想到卷积的形式,那么直接FFT就好了,但是后半部分不好考虑,一般肯定是通过类似换元的做法化到后来得出结论,到中间有一步就有点难度,那个地方我一直卡。后来突然想到,既然前半部分i<j时那么好处理,那么i>j的情况我把i和j分别用(n-i)和(n-j)代入不就转化过去了,然后直接就会发现他是卷积后的第(n-i)项,所以后面一半需要反转a数组和反转结果数组,这里要注意下标,第二部分,第0项对应第n-1项。

$E_i=\sum_{j<i} \frac{q_j}{(j-i)^2}-\sum_{j>i} \frac{q_j}{(j-i)^2}$
$E_i=\sum_{j<i} \frac{q_j}{(j-i)^2}-\sum_{n-j<n-i} \frac{q_{n-j}}{((n-j)-(n-i))^2}$
$E_i=\sum_{j<i} \frac{q_j}{(i-j)^2}-\sum_{n-j<n-i} \frac{q_{n-j}}{(j-i)^2}$

$E_i=f[j]\ast g[i-j]-f[n-j]\ast g[j-i]=c[i]-c^{'}[n-i]$

代码:

#include<bits/stdc++.h>
#include<complex>
#define db double
#define ll long long
#define mp make_pair
#define fi first
#define pb push_back
#define se second
#define rep(i,a,b)for(int i=a;i<=b;i++)
using namespace std;
const double pi=acos(-1);
const int maxn=5e5+7;
db spt(db x){return x*x;}
int r[maxn];
complex<double>a[maxn],b[maxn],c[maxn],d[maxn];
db ans[maxn];
int M,N,n,l=0;
db p[maxn];
void FFT(complex<double> f[],int op)
{
for(int i=0;i<N;i++)if(i<r[i])swap(f[i],f[r[i]]);
for(int i=1;i<N;i<<=1)
{
complex<double >w(cos(pi/i),op*sin(pi/i));
for(int p=(i<<1),j=0;j<N;j+=p)
{
complex<double>W(1,0);
for(int k=0;k<i;k++,W*=w)
{
complex<double>x=f[j+k],y=W*f[j+i+k];
f[j+k]=x+y;f[j+k+i]=x-y;
}
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lf",&p[i]);
}
N=M=n-1;
for(int i=0;i<n;i++){a[i]=p[i+1];if(i>=1)b[i]=1.0/spt(i);}
M+=N;
for(N=1;N<=M;N<<=1)l++;
for(int i=0;i<N;i++)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
FFT(a,1);FFT(b,1);
for(int i=0;i<=N;i++)a[i]=a[i]*b[i];
FFT(a,-1);
for(int i=0;i<n;i++)ans[i]+=a[i].real()*1.0/N;
for(int i=0;i<n;i++){c[i]=p[n-i];if(i>=1)d[i]=1/spt(i);}
FFT(c,1);FFT(d,1);
for(int i=0;i<=N;i++)c[i]=c[i]*d[i];
FFT(c,-1);
for(int i=0;i<n;i++)ans[i]-=c[n-i-1].real()*1.0/N;
for(int i=0;i<n;i++)printf("%.3lf\n",ans[i]); return 0; }

  PS:终于用上latex了,好不适应,,还不会用。

bzoj3527: [Zjoi2014]力 卷积+FFT的更多相关文章

  1. 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 ...

  2. BZOJ3527 [Zjoi2014]力 【fft】

    题目 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. 输入格式 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi. 输出格式 n行,第i行输出Ei.与标准答案误差不超过 ...

  3. [BZOJ3527][ZJOI2014]力:FFT

    分析 整理得下式: \[E_i=\sum_{j<i}{\frac{q_i}{(i-j)^2}}-\sum_{j>i}{\frac{q_i}{(i-j)^2}}\] 假设\(n=5\),考虑 ...

  4. bzoj3527: [Zjoi2014]力 fft

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

  5. 【BZOJ3527】力(FFT)

    [BZOJ3527]力(FFT) 题面 Description 给出n个数qi,给出Fj的定义如下: \[Fj=\sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_{ ...

  6. [Luogu P3338] [ZJOI2014]力 (数论 FFT 卷积)

    题面 传送门: 洛咕 BZOJ Solution 写到脑壳疼,我好菜啊 我们来颓柿子吧 \(F_j=\sum_{i<j}\frac{q_i*q_j}{(i-j)^2}-\sum_{i>j} ...

  7. 【BZOJ 3527】 3527: [Zjoi2014]力 (FFT)

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

  8. [bzoj3527][Zjoi2014]力_FFT

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

  9. [ZJOI2014]力(FFT)

    [Luogu3338] [BZOJ5327] (DarkBZOJ数据有问题) \(19.3.8\) 前置知识:[知乎-如何通俗易懂地解释卷积] [FFT详解] \(1.\)卷积定义 我们称 \((f* ...

随机推荐

  1. (办公)SpringBoot和swagger2的整合.

    因为开发项目的接口需要给app,小程序测试,所以用swagger. 1.pom.xml: <dependency><!--添加Swagger依赖 --> <groupId ...

  2. 通过Erlang构建TCP服务应用案例(最原始方式)

    文章来源:公众号-智能化IT系统. 案例介绍 本文介绍的案例是TCP网络服务器的构建,用最原始的方式(非OTP).其功能很简单,通过网络TCP接口接收数据,按照指定的格式解析,并把数据存储至Mongo ...

  3. 龙尚 U9300C wvdial 拨号上网

    龙尚 U9300C    7模   4G LTE   (国内全网通) 接入linux系统会有4个串口 其中ttyUSB2 为AT指令口 ttyUSB1 为拨号上网口 wvdial   拨号入网参数 [ ...

  4. Github上如何查看当前最流行的开源项目

    先声明下:只针对初学者,大神的话勿喷. 针对题标的这个问题,按照如下步骤操作即可: 进入Github网站后,显示的页面如下所示: 点击"Explore"链接,进入如下页面: 页面上 ...

  5. Jenkins之Job建立-运行本地脚本

    新建一个自由风格的项目,运行本地脚本 1.点击菜单栏中的“新任务” 2.进入该页面后输入一个项目名称,然后选择“构建一个自由风格的软件项目”,滑动到最底端,点击ok(在左下角) 3.进入下图页面后 “ ...

  6. Node.js完整的响应html页面(包括css,js文件)

    主要思想就是任何一个静态文件也应该做响应,一个获取静态文件都应当请求来处理,这是主要思想. 同时要注意两点.第一,对于不同的文件类型,比如html,css,js,请求头里面的文件类型需要根据不同的文件 ...

  7. Linux-基础学习(一)-基本命令

    开始今日份整理 1.Linux的文件目录操作 1.1 ls 简述:ls是list的缩写,用于列出指定目录或文件 常用的选项 1 -a:显示所有档案及目录(ls内定将档案名或目录名称为“.”的视为隐藏, ...

  8. 【vue】移动端demo资料

    http://imzjh.com/inew/#/(移动端demo) https://github.com/liangxiaojuan/eleme(饿了么git地址) https://github.co ...

  9. Java base64转图片

    import sun.misc.BASE64Decoder; import java.io.FileOutputStream; import java.io.OutputStream; public ...

  10. 多节点,多线程下发订单,使用zookeeper分布式锁机制保证订单正确接入oms系统

    假设订单下发, 采用单机每分钟从订单OrderEntry接口表中抓100单, 接入订单oms系统中. 由于双十一期间, 订单量激增, 导致订单单机每分钟100单造成, 订单积压. 所以采用多节点多线程 ...