【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 ...
随机推荐
- Mac下go语言goclipse插件安装部署
Try using this URL as a Eclipse Software Site:https://raw.githubusercontent.com/GoClipse/goclipse.gi ...
- Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2886 Solved: 924[Submit][Stat ...
- What does the “__block” keyword mean?
It tells the compiler that any variable marked by it must be treated in a special way when it is use ...
- poj 3628 (搜索or背包)
好久没看背包题目了!!!生疏了!!!! 这题是背包题!!!不过对于这题,解决方法还是搜索省时!!! 题意:第一行给你一个N和VV,接下来N行,每行一个数,求得是任选N个数组合求和,求组合的和大于VV而 ...
- soap实例入门(转)
SOAP的HelloWord实例- - 1.1 前言 2005-3-2公司开会并分给我一个任务:写一个程序从福建移动的BOSS系统取出一些相关数据.我得到的资料仅仅有一个“福建移动BOSS与业务增值 ...
- 传输层:TCP UDP SCTP
总图 虽然协议族被称为“TCP/IP”,但除了TCP和IP这两个主要协议外,还有许多其他成员.图2-1展示了这些协议的概况. 图2-1中同时展示了IPV4和IPV6.从右向左看该图,最右边的5个网络应 ...
- windows修改mysql默认字符集不成功
今天下午弄了半天,终于把mysql的默认字符集弄成了, 按照网上的说法,什么修改mysql下面的my.ini文件,把参数设置成utf-8,我反复操作,结果都是不成功,后来我把mysql5.0卸载了,网 ...
- LabVIEW设计模式系列——事件结构中值改变事件
标准:1.将具有值改变事件的控件,放置在其事件结构的值改变页面里.
- ARCGIS二维三维互动
当对三维模型进行操作时(如导航.平移)二维地图自动跟进. private void Synckron() { m_pGlobe = this._GlobeControl.Globe; m_pMap = ...
- angularjs 根据变量改变 动态加载模板
directive return { restrict: 'E', replace: true, templateUrl: 'app/view/order.html', link: function ...