题目

P3338 [ZJOI2014]力

做法

普通卷积形式为:\(c_k=\sum\limits_{i=1}^ka_ib_{k-i}\)

其实一般我们都是用\(i=0\)开始的,但这题比较特殊,忽略那部分,其他的直接按下标存下来,反正最后的答案是不变的

好了步入正题吧,我们定义 $$F_j=\sum\limits_{i<j}\dfrac{q_iq_j}{(i-j)2}-\sum\limits_{i<j}\dfrac{q_iq_j}{(i-j)2}$$

求\(E_i=\dfrac{F_i}{q_i}\)

显然$$E_j=\sum\limits_{i<j}\dfrac{q_i}{(i-j)2}-\sum\limits_{i<j}\dfrac{q_i}{(i-j)2}$$

\[E_j=\sum_{i=1}^{j-1}\dfrac{q_i}{(i-j)^2}-\sum_{i=j+1}^{n}\dfrac{q_i}{(i-j)^2}
\]

令\(f_i=q_i,g_i=\dfrac{1}{i^2}\),特别地,\(g_0=0\),则有:$$E_j=\sum_{i=1}{j-1}f_ig_{i-j}-\sum_{i=j+1}{n}f_ig_{i-j}$$

左边部分很简单就能化成卷积形式:$$\sum_{i=1}{j-1}f_ig_{i-j}=\sum_{i=1}{j-1}f_ig_{j-i}=\sum_{i=1}^{j}f_ig_{j-i}$$

右边部分:$$\sum\limits_{i=j+1}{n}f_ig_{i-j}=\sum\limits_{i=1}{n-j}f_{i+j}g_{i}$$

令\(p_i=f_{n-i}\),则\(p_{n-i-j}=f_{i+j}\),则有:$$\sum\limits_{i=1}{n-j}f_{i+j}g_{i}=\sum_{i=1}{n-j} p_{n-i-j}g_i$$

都化成卷积形式了直接FFT

My complete code

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const double Pi=acos(-1.0);
const int maxn=300000;
struct complex{
double x,y;
complex (double xx=0,double yy=0){
x=xx,y=yy;
}
}f[maxn],p[maxn],g[maxn];
int n,limit,L;
int r[maxn];
complex operator + (complex x,complex y){
return complex(x.x+y.x,x.y+y.y);
}
complex operator - (complex x,complex y){
return complex(x.x-y.x,x.y-y.y);
}
complex operator * (complex x,complex y){
return complex(x.x*y.x-x.y*y.y,x.x*y.y+x.y*y.x);
}
inline void FFT(complex *A,int type){
for(int i=0;i<limit;++i)
if(i<r[i])
swap(A[i],A[r[i]]);
for(int mid=1;mid<limit;mid<<=1){
complex WN(cos(Pi/mid),type*sin(Pi/mid));
for(int R=mid<<1,j=0;j<limit;j+=R){
complex w(1,0);
for(int k=0;k<mid;++k,w=w*WN){
complex x=A[j+k],y=w*A[j+mid+k];
A[j+k]=x+y,
A[j+mid+k]=x-y;
}
}
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%lf",&f[i].x),f[i].y=0,
g[i].x=(double)1.0/i/i;
p[n-i].x=f[i].x;
}
limit=1,L=0;
while(limit<n+n)
limit<<=1,
++L;
for(int i=0;i<limit;++i)
r[i]=(r[i>>1]>>1)|((i&1)<<(L-1));
FFT(f,1),FFT(p,1),FFT(g,1);
for(int i=0;i<limit;++i)
f[i]=f[i]*g[i];
for(int i=0;i<limit;++i)
p[i]=p[i]*g[i];
FFT(f,-1),FFT(p,-1);
for(int i=1;i<=n;++i)
printf("%.3lf\n",f[i].x/limit-p[n-i].x/limit);
return 0;
}/*
*/

P3338 [ZJOI2014]力(FFT)的更多相关文章

  1. P3338 [ZJOI2014]力 /// FFT 公式转化翻转

    题目大意: https://www.luogu.org/problemnew/show/P3338 题解 #include <bits/stdc++.h> #define N 300005 ...

  2. [Luogu]P3338 [ZJOI2014]力(FFT)

    题目描述 给出\(n\)个数\(q_i\),给出\(F_j\)的定义如下: \(F_j = \sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_{i>j}\fr ...

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

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

  4. 洛谷 P3338 [ZJOI2014]力 解题报告

    P3338 [ZJOI2014]力 题目描述 给出n个数qi,给出Fj的定义如下: \(F_j = \sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_{i>j ...

  5. [洛谷P3338] [ZJOI2014]力

    洛谷题目链接:P3338 [ZJOI2014]力 题目描述 给出n个数qi,给出Fj的定义如下: \[F_j = \sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_ ...

  6. bzoj3527: [Zjoi2014]力 fft

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

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

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

  8. 洛谷P3338 [ZJOI2014]力(FFT)

    传送门 题目要求$$E_i=\frac{F_i}{q_i}=\sum_{j=1}^{i-1}\frac{q_j}{(i-j)^2}-\sum_{j=i+1}^n\frac{q_j}{(j-i)^2}$ ...

  9. 【bzoj3527】[Zjoi2014]力 FFT

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

随机推荐

  1. DelphiXe 中静态数组TByteArray和动态数组TBytes /array of byte 的区别

    在应用中发现静态数组和动态数组是有区别的: procedure TForm1.Button1Click(Sender: TObject);var  RsltStream: TMemoryStream; ...

  2. hector_localization hector_salm rplidar同时编译

    1.将hector_localization包clone到src文件夹  进行功能包依赖安装 cd test_ws rosdep update rosdep install --from-paths ...

  3. SpringSecurity学习二----------实现自定义登录界面

    © 版权声明:本文为博主原创文章,转载请注明出处 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0& ...

  4. hdu 4454 Stealing a Cake(计算几何:最短距离、枚举/三分)

    题意:已知起点.圆.矩形,要求计算从起点开始,经过圆(和圆上任一点接触即可),到达矩形的路径的最短距离.(可以穿过园). 分析:没什么好的方法,凭感觉圆上的每个点对应最短距离,应该是一个凸函数,用三分 ...

  5. 在spring mvc中利用ajax批量删除数据

    1.前台代码: $("#batchdelete").click(function(){ $.ajax({ type: "post", url: url, dat ...

  6. kill 命令

    Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须 ...

  7. Android小应用之拨号器

    首先看一下Android Studio下怎么设置应用的ICON Activity的onCreate()方法 当界面刚被创建时会回调此方法,super.onCreate()执行父类的初始化操作,必须要加 ...

  8. windows svchost.exe 引起的出现的莫名其妙的窗口失去焦点

    我不知道你们遇到没,反正我是遇到了,现在我就把解决方法给你们,当然都是从网上整理下来的 这个失去焦点可以分为两种,一种是病毒,一种是系统自带的问题 首先你得知道自己的窗口被什么给挤掉了焦点 先看看这篇 ...

  9. HDOJ 4923 Room and Moor

    用一个栈维护b的值,每次把一个数放到栈顶. 看栈首的值是不是大于这个数,假设大于的话将栈顶2个元素合并.b的值就是这两个栈顶元素的平均值. .. Room and Moor Time Limit: 1 ...

  10. 那不是Bug,是新需求

    原文作者:Jeff Atwood 自从我干上软件开发这一行.而且使用了Bug跟踪系统.我们在每个项目里都会纠结一个主要的问题:你怎么能把Bug与功能需求区分开来? 当然,假设程序崩溃了,这毫无疑问是B ...