先写个简要题解:本来去桂林前就想速成一下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. Android为TV端助力linux命令

    从命令行push到系统目录,用户组是root,而代码里面的是个人用户组,所以要把你push进去的东西改成跟你APK一样的用户组,并且chmod -R 777 文件名修改文件的权限 修改用户组chown ...

  2. 算法: 整数中1出现的次数(从1到n整数中1出现的次数)

    问题: 整数中1出现的次数(从1到n整数中1出现的次数) 问题:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数? 为此他特别数了一下1~13中包含1的数字有1.10.11 ...

  3. python 通过元类控制类的创建

    一.python中如何创建类? 1. 直接定义类 class A: a = 'a' 2. 通过type对象创建 在python中一切都是对象 在上面这张图中,A是我们平常在python中写的类,它可以 ...

  4. 【转载】关于generate用法的总结【Verilog】

    原文链接: [原创]关于generate用法的总结[Verilog] - nanoty - 博客园http://www.cnblogs.com/nanoty/archive/2012/11/13/27 ...

  5. 三数之和的golang实现

    给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...

  6. 【Linux基础】iconv命令详解(编码转换)

    对于给定文件把它的内容从一种编码转换成另一种编码. iconv -f GBK -t UTF- file1 -o file2 //将GBK转换为UTF8,输出到file2.没-o那么会输出到标准输出 i ...

  7. RabbitMQ安装后无法访问https://localhost:15672/ 控制台问题解决

    1.安装完后 我们进入到我们安装到 sbin目录C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.2\sbin执行:rabbitmq-plugi ...

  8. SQL NULL 函数

    SQL ISNULL().NVL().IFNULL() 和 COALESCE() 函数 请看下面的 "Products" 表: P_Id ProductName UnitPrice ...

  9. k-近邻(KNN)算法改进约会网站的配对效果[Python]

    使用Python实现k-近邻算法的一般流程为: 1.收集数据:提供文本文件 2.准备数据:使用Python解析文本文件,预处理 3.分析数据:可视化处理 4.训练算法:此步骤不适用与k——近邻算法 5 ...

  10. android系统中如何通过程序打开某个AccessibilityService

    android系统中如何通过程序打开某个AccessibilityService(系统辅助服务)? 通常的做法是注册AccessibilityService(辅助服务)后跳转到设置启动服务页面引导用户 ...