【BZOJ3527】【FFT】力
【问题描述】
给出n个数qi,给出Fj的定义如下:
令Ei=Fi/qi。试求Ei。
【输入格式】
输入文件force.in包含一个整数n,接下来n行每行输入一个数,第i行表示qi。
【输出格式】
输出文件force.out有n行,第i行输出Ei。与标准答案误差不超过1e-2即可。
【样例输入】
5
4006373.885184
15375036.435759
1717456.469144
8514941.004912
1410681.345880
【样例输出】
-16838672.693
3439.793
7509018.566
4595686.886
10903040.872
【数据规模与约定】
对于30%的数据,n≤1000。
对于50%的数据,n≤60000。
对于100%的数据,n≤100000,0<qi<1000000000。
【分析】
这道题...在省选里面相当裸了。
自己把式子展开一下,发现跟卷积是类似的。
于是对公式的前半部分做一下FFT,后半部分再做一下FFT,减一下,然后就是公式的样子了。
感觉对FFT的理解更进一步了。
/*
宋代苏轼
《临江仙·夜饮东坡醒复醉》
夜饮东坡醒复醉,归来仿佛三更。家童鼻息已雷鸣。敲门都不应,倚杖听江声。
长恨此身非我有,何时忘却营营。夜阑风静縠纹平。小舟从此逝,江海寄余生。
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <iostream>
#include <string>
#include <ctime>
#define LOCAL
const double Pi = acos(-1.0);
const int MAXN = * * + ;
using namespace std;
struct Num{
double a, b;
Num(double x = , double y = ){a = x; b = y;}
Num operator + (const Num &c){return Num(a + c.a, b + c.b);}
Num operator - (const Num &c){return Num(a - c.a, b - c.b);}
Num operator * (const Num &c){return Num(a * c.a - b * c.b, a * c.b + b * c.a);}
}x1[MAXN], x2[MAXN];
double data[MAXN], Ans[MAXN];
int n;
//交换成蝴蝶顺序
void change(Num *t, int len, int loglen){
for (int i = ; i < len; i++){
int k = , x = i, tmp = loglen;
while (tmp--) {k = (k<<) + (x & );x >>= ;}
if (k < i) swap(t[k], t[i]);
}
return;
}
//0为逆向
void FFT(Num *x, int len, int loglen, int type){
if (type) change(x, len, loglen);
int t;//t代表长度
t = (type ? : (<<loglen));
for (int i = ; i < loglen; i++){
if (!type) t >>= ;
int l = , r = l + t;
while (l < len){
Num a, b;//临时变量
Num tmp(, ), w(cos(Pi / t), (type ? : -) * sin(Pi / t));
for (int j = l; j < l + t; j++){
if (type){
a = x[j];
b = x[j + t] * tmp;
x[j] = a + b;
x[j + t] = a - b;
}else{
a = x[j] + x[j + t];
b = (x[j] - x[j + t]) * tmp;
x[j] = a;
x[j + t] = b;
}
tmp = tmp * w;
}
l = r + t;
r = l + t;
}
if (type) t <<= ;
}
if (!type){
change(x, len, loglen);
for (int i = ; i < len; i++) x[i].a /= len;
}
}
void init(){
memset(x1, , sizeof(x1));
memset(x2, , sizeof(x2));
int len = ;
while (( << len) < n) len++;
len++;
for (int i = ; i < n; i++) x1[i] = Num(data[i], );
for (int i = ; i < n; i++) x2[i] = Num((double)1.0 / (double)(i * (double)i), );
//for (int i = 1; i < n; i++) printf("%lf\n", x2[i].a); FFT(x1, (<<len), len, );
FFT(x2, (<<len), len, );
for (int i = ; i < ( << len); i++) x1[i] = x1[i] * x2[i];
FFT(x1, (<<len), len, );
}
void debug(){
int len = ;
scanf("%d", &n);
while ((<<len) <= (n << )) len++;
for (int i = ; i < n; i++) scanf("%lf", &x1[i].a);
for (int i = ; i < n; i++) scanf("%lf", &x2[i].a);
FFT(x1, (<<len), len, );
FFT(x2, (<<len), len, );
for (int i = ; i < ( << len); i++) x1[i] = x1[i] * x2[i];
FFT(x1, (<<len), len, );
for (int i = ; i < n; i++) printf("%lf\n", x1[i].a);
} int main() { scanf("%d", &n);
for (int i = ; i < n; i++) scanf("%lf", &data[i]);
init();
for (int i = ; i < n; i++) Ans[i] = x1[i].a;
reverse(data, data + n);
init();
for (int i = ; i < n; i++) Ans[i] -= x1[n - - i].a;
for (int i = ; i < n; i++) printf("%.3lf\n", Ans[i]);
//debug();
return ;
}
【BZOJ3527】【FFT】力的更多相关文章
- 【BZOJ3527】力(FFT)
[BZOJ3527]力(FFT) 题面 Description 给出n个数qi,给出Fj的定义如下: \[Fj=\sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_{ ...
- bzoj3527: [Zjoi2014]力 fft
bzoj3527: [Zjoi2014]力 fft 链接 bzoj 思路 但是我们求得是 \(\sum\limits _{i<j} \frac{q_i}{(i-j)^2}-\sum_{i> ...
- 【BZOJ-3527】力 FFT
3527: [Zjoi2014]力 Time Limit: 30 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 1544 Solved: 89 ...
- bzoj3527: [Zjoi2014]力 卷积+FFT
先写个简要题解:本来去桂林前就想速成一下FFT的,结果一直没有速成成功,然后这几天断断续续看了下,感觉可以写一个简单一点的题了,于是就拿这个题来写,之前式子看着别人的题解都不太推的对,然后早上6点多推 ...
- 2019.02.28 bzoj3527: [Zjoi2014]力(fft)
传送门 fftfftfft菜题. 题意简述:给一个数列aia_iai,对于i=1→ni=1\rightarrow ni=1→n求出ansi=∑i<jai(i−j)2−∑i>jai(i−j ...
- BZOJ3527 [Zjoi2014]力 【fft】
题目 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. 输入格式 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi. 输出格式 n行,第i行输出Ei.与标准答案误差不超过 ...
- [BZOJ3527][ZJOI2014]力 FFT+数学
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3527 首先卷积的形式是$h(i)=\sum_{i=0}^jf(i)g(i-j)$,如果我们 ...
- [BZOJ3527][ZJOI2014]力:FFT
分析 整理得下式: \[E_i=\sum_{j<i}{\frac{q_i}{(i-j)^2}}-\sum_{j>i}{\frac{q_i}{(i-j)^2}}\] 假设\(n=5\),考虑 ...
- BZOJ3527[Zjoi2014]力——FFT
题目描述 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. 输入 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi. n≤100000,0<qi<100000 ...
- [bzoj3527][Zjoi2014]力_FFT
力 bzoj-3527 Zjoi-2014 题目大意:给定长度为$n$的$q$序列,定义$F_i=\sum\limits_{i<j}\frac{q_iq_j}{(i-j)^2}-\sum\lim ...
随机推荐
- Java---replace与replaceAll的区别
乍一看,字面上理解好像replace只替换第一个出现的字符(受javascript的影响),replaceall替换所有的字符,其实大不然,只是替换的用途不一样. 这两者很容易搞混,在这里详细讲述下. ...
- 美工代码注意事项(html+div+css+js)
window.location.href的target控制 在使用框架时,经常会对框架子页面进行页面引导的情况,如果只是简单的设置location. href="",会使得整个页面 ...
- UVA 4728 Squares(凸包+旋转卡壳)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17267 [思路] 凸包+旋转卡壳 求出凸包,用旋转卡壳算出凸包的直 ...
- JavaScript高级程序设计50.pdf
hashchange事件 HTML5新增了hashchange事件,以便在URL的参数列表(及URL中“#”号后面的所有字符串)发生变化时通知开发人员,之所以新增这个事件,是因为在Ajax应用中,开发 ...
- table 的thead th 固定 tbody滚动例子
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 第一次尝试使用JAVA编写的ATM机程序
package study; import java.util.Scanner; public class ATM { private static int[] users = { 111111, 2 ...
- jquery ajax 使用layer的超时提示
<!DOCTYPE html> <html> <head> <title>我是标题</title> <meta name=" ...
- jQuery ajax传递特殊字符参数(例如+)
使用jQuery ajax向后台传递参数para=1+1时后台接收到的参数为para=1 1,解决方案是 使用json传递,代码如下. var url = "/test/check" ...
- CentOS源码安装搭建LNMP全过程(包括nginx,mysql,php,svn)【转】
转自:http://blog.csdn.net/yanzi1225627/article/details/49123659 服务器环境为:CentOS6.5 64位 目标:搭建LNMP(Linux + ...
- 【原创】javascript——prototype与__proto__
一定要注意这个概念:javascript世界里,万物皆对象, function是对象,prototyp也是对象. 新建构造函数,并实例 var Person = function(){} var ...