博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3527 [Zjoi2014]力
阅读量:7112 次
发布时间:2019-06-28

本文共 2449 字,大约阅读时间需要 8 分钟。

Description

给出$n$个数$q_i$,给出$F_j$的定义如下:

$$F_j=\sum_{i<j}\frac{q_iq_j}{(i-j)^2}-\sum_{i>j}\frac{q_iq_j}{(i-j)^2}$$
令$E_i=\frac{F_i}{q_i}$,求$E_i$.

 

Input

第一行一个整数n。
接下来n行每行输入一个数,第i行表示qi。
n≤100000,0<qi<1000000000
 
 

Output

 n行,第i行输出Ei。与标准答案误差不超过1e-2即可。

Sample Input

5
4006373.885184
15375036.435759
1717456.469144
8514941.004912
1410681.345880

Sample Output

-16838672.693
3439.793
7509018.566
4595686.886
10903040.872

题解

由于

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

我们令$t_i = [i>0]i^{-2}$,那么

$$E_i = \sum_{j<i}q_jt_{i-j} - \sum_{j>i}q_jt_{j-i}$$

对于前一项,直接FFT计算;对于后一项,可以将数组q翻转后即可得到卷积形式,FFT即可。

代码:

#include 
#include
#include
#include
typedef std::complex
Complex;const double pi = acos(-1.0);const int N = 400000;double E[N], Q[N];Complex A[N], B[N];void FFT(Complex *P, int len, int opt) { for (int i = 1, j = len >> 1; i < len; ++i) { if (i < j) std::swap(P[i], P[j]); int k = len; do { k >>= 1; j ^= k; } while (~j & k); } for (int h = 2; h <= len; h <<= 1) { Complex wn(cos(2 * pi * opt / h), sin(2 * pi * opt / h)); for (int j = 0; j < len; j += h) { Complex w(1.0, 0.0); for (int k = 0; k < h / 2; ++k) { Complex t1 = P[j + k] , t2 = P[j + k + h / 2] * w; P[j + k] = t1 + t2; P[j + k + h / 2] = t1 - t2; w *= wn; } } } if (opt == -1) { for (int i = 0; i < len; ++i) P[i] /= len; }}int main() { int n; scanf("%d", &n); for (int i = 0; i < n; ++i) scanf("%lf", &Q[i]); int len = 1; while (len < 2 * n) len <<= 1; for (int i = 0; i < n; ++i) A[i] = Q[i]; for (int i = n; i < len; ++i) A[i] = 0.0; B[0] = 0.0; for (int i = 1; i < n; ++i) B[i] = 1.0 / i / i; for (int i = n; i < len; ++i) B[i] = 0.0; FFT(A, len, 1); FFT(B, len, 1); for (int i = 0; i < len; ++i) A[i] *= B[i]; FFT(A, len, -1); for (int i = 0; i < n; ++i) E[i] += A[i].real(); for (int i = 0; i < n; ++i) A[i] = Q[n - i - 1]; for (int i = n; i < len; ++i) A[i] = 0.0; B[0] = 0.0; for (int i = 1; i < n; ++i) B[i] = 1.0 / i / i; for (int i = n; i < len; ++i) B[i] = 0.0; FFT(A, len, 1); FFT(B, len, 1); for (int i = 0; i < len; ++i) A[i] *= B[i]; FFT(A, len, -1); for (int i = 0; i < n; ++i) E[n - i - 1] -= A[i].real(); for (int i = 0; i < n; ++i) printf("%.10lf\n", E[i]); return 0;}

  

转载于:https://www.cnblogs.com/y-clever/p/7371555.html

你可能感兴趣的文章
精度计算-大数乘小数
查看>>
X3D.Engine应用领域
查看>>
spring bean的自动装配方式 种种
查看>>
axis2 client namespace mismatch
查看>>
Dagger学习之实践篇
查看>>
jackson xml或json转换到对象,映射到不同子类
查看>>
Golang、python中的字符串、slice、list性能研究。
查看>>
Emulator:This AVD's configuration is missing a ...
查看>>
各大网站架构总结笔记【转】
查看>>
Android mac上配置环境变量
查看>>
社会网络分析——Social Network Analysis
查看>>
mysql 判断是否为空
查看>>
mysql 查排名
查看>>
RSS订阅开发
查看>>
git 配置
查看>>
hdu 4995
查看>>
android Button,textView 等控件设置控件内嵌周围图片使用方法
查看>>
MYSQL-- 每半月一个分区,自动维护
查看>>
使用php Memcache模块如何正确遍历所有KEY以及VALUE
查看>>
tomcat内存泄露问题解决方法
查看>>