题目描述

给出\(n\)个数\(q_i\),给出\(F_j\)的定义如下:

\(F_j = \sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_{i>j}\frac{q_i q_j}{(i-j)^2 }\)

令\(E_i=F_i/q_i\),求\(E_i\).

输入输出格式

输入格式:

第一行一个整数n。

接下来n行每行输入一个数,第i行表示qi。

输出格式:

n行,第i行输出Ei。

与标准答案误差不超过1e-2即可。

输入输出样例

输入样例#1: 复制

5

4006373.885184

15375036.435759

1717456.469144

8514941.004912

1410681.345880

输出样例#1: 复制

-16838672.693

3439.793

7509018.566

4595686.886

10903040.872

说明

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

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

对于100%的数据,n≤100000,0<qi<1000000000。

[spj 0.01]

题解

一道对于刚学FFT的人不错的题目。

完全可以自己手推。

搞了我晚自习半个小时才推出来...作业都没写完。

对于这个式子

\(F_j = \sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_{i>j}\frac{q_i q_j}{(i-j)^2 }\)

因为Ei是Fi/qi

所以我们首先消掉qi

所以变成了这样

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

好,接下来我们发现暴力O(n^2)就可以求出来了。

怎么转换到FFT里面去?

先O(n)处理出(i-j)^2.

这个时候我们列出样例。

对于E1=

4006373.885184*(1-1)^2 +
15375036.435759*(1-2)^2 -
1717456.469144*(1-3)^2 -
8514941.004912*(1-4)^2 -
1410681.345880*(1-5)^2 -

然后加起来

对于E2=

4006373.885184*(2-1)^2 +
15375036.435759*(2-2)^2 +
1717456.469144*(2-3)^2 -
8514941.004912*(2-4)^2 -
1410681.345880*(2-5)^2 -

观察后面的(i-j)^2项。

是不是相当于

\(-0.0625,-0.111111x,-0.25x^2,-1x^3,0x^4,1x^5,0.25x^6,0.111111x^7,0.0625x^8\)

\(*\)

\(4006373.885184,15375036.435759x,1717456.469144x^2,8514941.004912x^3,1410681.345880x^4\)

转换为卷积就可以了。

Code

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<complex>
#define debug cout<<"JEFF是我们的红太阳!!"<<endl;
#define ll long long
using namespace std;
typedef complex<double> cp;
const int N=1e6+5;
const double pi=acos(-1.0);
cp a[N],b[N];
ll l,n,cnt,limit=1,r[N];
int read(){
int x=0,w=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
} void FFT(cp *A,int type){
for(int i=0;i<limit;i++)if(i<r[i])swap(A[r[i]],A[i]);
for(int i=1;i<limit;i<<=1){
cp wn(cos(pi/i),sin(type*pi/i));
for(int j=0;j<limit;j+=(i<<1)){
cp w(1,0),x,y;
for(int k=0;k<i;k++){
x=A[k+j];y=A[k+j+i]*w;
A[k+j]=x+y;A[k+j+i]=x-y;
w=w*wn;
}
}
}
} int main(){
n=read();
for(int i=0;i<n;i++){
double x;
scanf("%lf",&x);
b[i]=x;
}
for(int i=n-1;i>=1;i--){
a[cnt]=-(1.0/(1.0*i*i));cnt++;
}a[cnt]=0;cnt++;
for(int i=1;i<=n-1;i++){
a[cnt]=(1.0/(1.0*i*i));cnt++;
}cnt--;
while(cnt+n>=limit)limit<<=1,l++;
for(int i=1;i<limit;i++)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
FFT(a,1);FFT(b,1);
for(int i=0;i<limit;i++)a[i]*=b[i];
FFT(a,-1);for(int i=0;i<limit;i++)a[i]/=limit;
for(int i=n-1;i<=2*n-2;i++)printf("%.3lf\n",(double)(a[i].real()));
return 0;
}

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

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

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

  2. P3338 [ZJOI2014]力(FFT)

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

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

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

  4. luogu P3338 [ZJOI2014]力

    传送门 首先化简原式\[F_j=\sum_{i<j}\frac{q_iq_j}{(i-j)^2}-\sum_{i>j}\frac{q_iq_j}{(i-j)^2},E_j=F_j/q_j\ ...

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

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

  6. [洛谷P3338] [ZJOI2014]力

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

  7. bzoj3527: [Zjoi2014]力 fft

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

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

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

  9. 洛谷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}$ ...

随机推荐

  1. Java 面向对象详解

    0 引言 接触项目开发也有很长一段时间了,最近开始萌发出想回过头来写写以前学过的基础知识的想法. 1 面向对象 面向对象(Object Oriented)是一种新兴的程序设计方法,或者是一种新的程序设 ...

  2. vue2 在methods 中无法获取this对象

    在methods中使用箭头函数无法获取this ExamName:()=> { console.log(this);} 这样就行了: ExamName:function() { console. ...

  3. [BOI2011]MET-Meteors

    题目:洛谷P3527. 题目大意:n个国家在某星球上建立了m个空间站(一个空间站只属于一个国家),空间站围成一个环.现在知道要下k天陨石,每天都在一个区间内下,每个点都下同样多的(若r>l,则说 ...

  4. BZOJ 2118 墨墨的等式 (同余最短路)

    题目大意:已知B的范围,求a1x1+a2x2+...+anxn==B存在非负正整数解的B的数量,N<=12,ai<=1e5,B<=1e12 同余最短路裸题 思想大概是这样的,我们选定 ...

  5. myeclipse如何取消某一个文件的校验

  6. js 学习思维导图

  7. springboot项目封装为docker镜像

    1.本次镜像的基础镜像是:https://www.cnblogs.com/JoeyWong/p/9173265.html 2.将打包好的项目文件放在与Dockerfile同级的目录下 3.Docker ...

  8. 【【henuacm2016级暑期训练】动态规划专题 E】Destroying Roads

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 首先. 这张图是无向无权图. 因此任意两点之间的最短路可以通过N^2的bfs轻易算出来. 即得到d[N+10][N+10] 考虑s[ ...

  9. java字符文件的读写

    1.java文件读写,首先我们需要导入相应的包:java.io.*; 2.代码如下: package Demo1; import java.io.*; public class FileWirteTe ...

  10. 【Linux】进程调度概述

    1 可运行队列 (基于实时进程调度) 调度程序中最主要的数据结构式运行队列(runqueue).可运行队列是给定处理器上的可运行进程的链表,每一个处理器一个. 每一个可投入运行的进程都唯一的归属于一个 ...