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] 力的更多相关文章

  1. 洛谷P3338 力

    题意: 解: 介绍两种方法. 首先可以把那个最后除的qi拆掉. ①分前后两部分处理. 前一部分可以看做是个卷积.下面的平方不拆开,直接看成gi-j即可. 后一部分按照套路,把循环变量改成从0开始,反转 ...

  2. [洛谷P3338] [ZJOI2014]力

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

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

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

  4. 【洛谷 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]= ...

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

  6. 洛谷 P3338 [ZJOI2014]力

    题意简述 读入\(n\)个数\(q_i\) 设\(F_j = \sum\limits_{i<j}\frac{q_i\times q_j}{(i-j)^2 }-\sum\limits_{i> ...

  7. 【洛谷P3338】力

    题目大意:求 \[ E_{j}=\sum_{i<j} \frac{q_{i}}{(i-j)^{2}}-\sum_{i>j} \frac{q_{i}}{(i-j)^{2}} \] 题解:可以 ...

  8. [bzoj3527] [洛谷P3338] [Zjoi2014]力

    Description 给出n个数qi,给出Fj的定义如下: \[ F_j=\sum\limits_{i<j} \frac{q_iq_j}{(i-j)^2} - \sum\limits_{i&g ...

  9. 「洛谷3338」「ZJOI2014」力【FFT】

    题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...

随机推荐

  1. FreeRTOS的学习路线

    背景 由于之前接触过一些嵌入式RTOS,如Keil-RTX,uCOS-II,也曾经关注过FreeRTOS,但一直没有机会采用FreeRTOS开发.目前FreeRTOS做为主流RTOS,风声正盛.作为嵌 ...

  2. PHP静态文件缓存

    ob_start(); 2 echo 'aaa'; 3 $string = ob_get_contents(); 4 file_put_contents('a.html', $string); 5 o ...

  3. JZOJ 1267. 路障

    1267. 路障(block.pas/c/cpp) (File IO): input:block.in output:block.out Time Limits: 1000 ms  Memory Li ...

  4. 常见的js算法面试题收集,es6实现

    1.js 统计一个字符串出现频率最高的字母/数字 let str = 'asdfghjklaqwertyuiopiaia'; const strChar = str => { let strin ...

  5. python实现导出excel表(前端+后端)

    之前在做项目管理系统的时候需要实现将数据导出到excel表的功能,搜索之后发现了python的xlwt模块可以很好的实现这项功能. 首先是导入xlwt模块: import xlwtfrom io im ...

  6. (HTML)A标签伪元素选择器的继承关系

    ①如果a:link{}也存在,那么不管a{}放到哪里,a{}和a:link{}冲突的属性都会采用a:link{}的,不冲突的属性若存在a{}中,会被a:link{}. a:visited{} .a:h ...

  7. 用 Tensorflow 建立 CNN

    稍稍乱入的CNN,本文依然是学习周莫烦视频的笔记. 还有 google 在 udacity 上的 CNN 教程. CNN(Convolutional Neural Networks) 卷积神经网络简单 ...

  8. python之随机数random模块

    random模块:用于生成随机数 import random #random模块:用于生成随机数 li = [] for i in range(7): r = random.randrange(0,3 ...

  9. C#串口扫描枪的简单实现

    原文:C#串口扫描枪的简单实现 串口扫描枪的简单实现 基于串口通讯的扫描枪的实现,主要借助SerialPort类,表示串行端口资源.实现很简单: 工具:usb转RS232转接头/个,扫描枪/套, 扫描 ...

  10. mongoTemplate聚合操作Demo

    package com.tangzhe.mongodb.mongotemplate; import com.mongodb.BasicDBObject; import com.mongodb.DBOb ...