题目描述

给出\(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;
}

最新文章

  1. 阅读ArrayBlockingQueue源码了解如何利用锁实现BlockingQueue
  2. 【ContextMenu】DataContext不自动更新
  3. NoSQL-Redis【1】-控制台配置密码
  4. SQL 2008 RAISERROR语法在SQL 2012/2014不兼容问题
  5. jQuery 关于 end() 方法的详细解释
  6. 用sublime编译C++的方法
  7. HTML与CSS入门——第十章 创建用于Web上的图像
  8. hdu 1428 漫步校园
  9. OS X 10.10 Yosemite Beta能够下载了
  10. 微软 Build 2017 开发者大会:Azure 与 AI 的快速发展
  11. Java入门(3)—— 数组
  12. Vagrant下共享目录下静态文件(js/jpg/png等)修改完运行报错
  13. SQL Server 2016 Alwayson新增功能
  14. ABP官方文档翻译 3.2 值对象
  15. Linux上查看用户名和组并把特定用户放到特定的组之下
  16. 51nod 1179 最大的最大公约数
  17. Thinkphp中的 I 函数(Thinkphp3.2.3版本)
  18. 高可用Redis(六):瑞士军刀之bitmap,HyperLoglog和GEO
  19. ASP.NET Core 新建线程中使用依赖注入的问题
  20. ADO.Net 数据库增加

热门文章

  1. 基础——(4)D Latch(D锁存器)
  2. Jmeter中模拟多用户执行多场景操作
  3. 【转】Retina 屏幕下,网页图片的显示兼容
  4. CefSharp获取页面Html代码的两种方式
  5. debian 9 添加源
  6. 2015 Multi-University Training Contest 6 hdu 5360 Hiking
  7. C#一个托付的样例
  8. bzoj1293: [SCOI2009]生日礼物(stl堆)
  9. MongoDB数据查询详解
  10. iOS:简单使用UIAlertVIew和UIActionSheet