洛谷 [P3338] 力
FFT
\[E_i = F_i / q_i = \sum_{i<j} \frac {q_j} {(i - j)^2} - \sum _{ i > j} \frac{q _ j} {(i - j)^2}\]
设 \(p _ i = q_{n - i}\) \(g(i) = \frac 1 {i^2}\)
则 \(E_i = \sum_{j=1}^{i-1} q _ i g(j - i) - \sum _ {j = i + 1} ^ n q_j g(i - j)\)
即 \(E_i = \sum_{j=1}^{i-1} q_i g(i-1) - \sum_{j=1}^{n - i} p_i g(i - j)\)
我们发现这是一个卷积的形式, 可以用 FFT 处理
cpp #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int MAXN = 400005; const double PI = acos(-1); struct Complex { double x, y; Complex(double xx = 0.0, double yy = 0.0) { x = xx; y = yy; } Complex operator + (const Complex &u) const { return Complex(x + u.x, y + u.y); } Complex operator - (const Complex &u) const { return Complex(x - u.x, y - u.y); } Complex operator * (const Complex &u) const{ return Complex(x * u.x - y * u.y, x * u.y + y * u.x); } }a[MAXN], b[MAXN], c[MAXN], buf[MAXN]; int n, lim = 1, limcnt, rev[MAXN]; void fft(Complex a[], int opt) { for(int i = 0; i <= lim; i++) { if(i < rev[i]) swap(a[i], a[rev[i]]); } for(int mid = 1; mid < lim; mid <<= 1) { Complex wn = Complex(cos(PI / mid), opt * sin(PI / mid)); for(int R = mid << 1, j = 0; j < lim; j += R) { Complex w = Complex(1.0, 0.0); for(int k = 0; k < mid; k++) { Complex x = a[j + k], y = w * a[j + mid + k]; a[j + k] = x + y; a[j + mid + k] = x - y; w = w * wn; } } } if(opt == -1) { for(int i = 0; i <= lim; i++) a[i].x = a[i].x / lim; } } int main() { cin >> n; for(int i = 1; i <= n; i++) { scanf("%lf", &a[i].x); b[n - i].x = a[i].x; c[i].x = (1.0 / (double)i) / (double)i; } while(lim <= (n << 1)) lim <<= 1, limcnt++; for(int i = 0; i <= lim; i++) { rev[i] = (rev[i>>1]>>1) | ((i&1)<<(limcnt - 1)); } fft(a, 1);fft(b, 1); fft(c, 1); for(int i = 0; i <= lim; i++) a[i] = a[i] * c[i]; for(int i = 0; i <= lim; i++) b[i] = b[i] * c[i]; fft(a, -1); fft(b, -1); for(int i = 1; i <= n; i++) { printf("%.4f\n", a[i].x - b[n - i].x); } return 0; }
洛谷 [P3338] 力的更多相关文章
- 洛谷P3338 力
题意: 解: 介绍两种方法. 首先可以把那个最后除的qi拆掉. ①分前后两部分处理. 前一部分可以看做是个卷积.下面的平方不拆开,直接看成gi-j即可. 后一部分按照套路,把循环变量改成从0开始,反转 ...
- [洛谷P3338] [ZJOI2014]力
洛谷题目链接:P3338 [ZJOI2014]力 题目描述 给出n个数qi,给出Fj的定义如下: \[F_j = \sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_ ...
- 洛谷 P3338 [ZJOI2014]力 解题报告
P3338 [ZJOI2014]力 题目描述 给出n个数qi,给出Fj的定义如下: \(F_j = \sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_{i>j ...
- 【洛谷 P3338】 [ZJOI2014]力(FFT)
题目链接 \[\Huge{E_i=\sum_{j=1}^{i-1}\frac{q_j}{(i-j)^2}-\sum_{j=i+1}^{n}\frac{q_j}{(i-j)^2}}\] 设\(A[i]= ...
- 洛谷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}$ ...
- 洛谷 P3338 [ZJOI2014]力
题意简述 读入\(n\)个数\(q_i\) 设\(F_j = \sum\limits_{i<j}\frac{q_i\times q_j}{(i-j)^2 }-\sum\limits_{i> ...
- 【洛谷P3338】力
题目大意:求 \[ E_{j}=\sum_{i<j} \frac{q_{i}}{(i-j)^{2}}-\sum_{i>j} \frac{q_{i}}{(i-j)^{2}} \] 题解:可以 ...
- [bzoj3527] [洛谷P3338] [Zjoi2014]力
Description 给出n个数qi,给出Fj的定义如下: \[ F_j=\sum\limits_{i<j} \frac{q_iq_j}{(i-j)^2} - \sum\limits_{i&g ...
- 「洛谷3338」「ZJOI2014」力【FFT】
题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...
随机推荐
- 读取properties的简单方法,使用@Configuration
配置类代码如下 import org.springframework.beans.factory.annotation.Value; import org.springframework.contex ...
- JZOJ 1264. 乱头发节
1264. 乱头发节(badhair.pas/c/cpp) (File IO): input:badhair.in output:badhair.out Time Limits: 1000 ms M ...
- A1046 Shortest Distance (20)(20 分)
1046 Shortest Distance (20)(20 分)提问 The task is really simple: given N exits on a highway which form ...
- Poj3061Subsequence
A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, a ...
- loj2061 「HAOI2016」放棋子
答案就是错排数 n = int(input()) f = [0] * 205 f[0] = 1 for i in range(2, n+1): f[i] = (i-1) * (f[i-1] + f[i ...
- mate viewport
<meta name="viewport" content="width=device-width,height=device-height,initial-sca ...
- Visual Studio 在 C# 项目添加动态链接库 dll
DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型. 使用DLL文件的好处是程序不需要在运行之初加载所有代码,只有在程序需要某个函数的时候才从 ...
- Leetcode 576.出界的路劲数
出界的路径数 给定一个 m × n 的网格和一个球.球的起始坐标为 (i,j) ,你可以将球移到相邻的单元格内,或者往上.下.左.右四个方向上移动使球穿过网格边界.但是,你最多可以移动 N 次.找出可 ...
- LeetCode with Python -> Dynamic Programming
198. House Robber You are a professional robber planning to rob houses along a street. Each house ha ...
- [python工具][pycharm]pycharm licence activation失效的解决方法
推荐网站: http://idea.lanyus.com/ 1 请将“0.0.0.0 account.jetbrains.com”添加到C:\Windows\System32\Drivers\etc\ ...