BZOJ3527 [Zjoi2014]力 【fft】
题目
给出n个数qi,给出Fj的定义如下:
令Ei=Fi/qi,求Ei.
输入格式
第一行一个整数n。
接下来n行每行输入一个数,第i行表示qi。
输出格式
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
题解
卷积什么的感觉好优美~~
卷积
先普及一下离散卷积的定义【瞎编的】:
对于两个序列\(x(n)\)和\(y(n)\)
其卷积\((x*y)(n) = \sum_{-\infty}^{\infty}x(k)y(n - k)\)
即当一个序列所有i位置上的值c(i)等于所有位置之和为i的x(k)*y(i - k)乘积的和时,可以看做c()为x()和y()的卷积
就好比多项式a(n) b(n)相乘,对于次数i的系数\(c(i)=\sum a(k)*b(i - k)\)
而求离散卷积可以使用离散快速傅里叶\(O(nlogn)\)高效求出
本题##
观察式子
\(Ei = \sum_{j<i}\frac{qj}{(i-j)^2} - \sum_{j>i}\frac{qj}{(i-j)^2}\)
我们将两个求和分开来求
我们令\(b(i) = \frac{1}{i^2}\),特别的,\(b(0) = 0\)
我们令\(a(i) = qi\)
我们会发现左边【即为\(L(i)\)】\(L(i) = \sum a(j)*b(i - j)\),刚好就是卷积的形式
可以用fft求出
同样的,对于右边
\(R(i) = \sum a(j)*b(j - i)\)
诶?不对啊,\(j + j - i\)不是定值啊。
但是ta们的位置关系还是很固定,考虑变形
我们将\(a(i)\)翻转,即令\(c(n-i)=a(i)\)
奇迹发生了:
\(R(i) = \sum c(n - j)*b(j - i)\)
这样我们算出的卷积,\(R(i)\)就与\(E_{n-i}\)对应
最后将算出的两个结果相减
呼啦啦,搞完啦~~
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<complex>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
using namespace std;
const int maxn = 400005,maxm = 100005,INF = 1000000000;
const double pi = acos(-1);
typedef complex<double> E;
E a[maxn],b[maxn],aa[maxn];
int n,m,L,R[maxn];
void fft(E* a,int f){
for (int i = 0; i < n; i++) if (i < R[i]) swap(a[i],a[R[i]]);
for (int i = 1; i < n; i <<= 1){
E wn(cos(pi / i),f * sin(pi / i));
for (int j = 0; j < n; j += (i << 1)){
E w(1,0);
for (int k = 0; k < i; k++,w *= wn){
E x = a[j + k],y = w * a[j + k + i];
a[j + k] = x + y; a[j + k + i] = x - y;
}
}
}
if (f == -1) for (int i = 0; i < n; i++) a[i] /= n;
}
int main(){
scanf("%d",&n); --n; double q;
for (int i = 0; i <= n; i++){
scanf("%lf",&q);
a[i] = q; aa[n - i] = q;
}
for (int i = 1; i <= n; i++) b[i] = 1.0 / i / i;
m = n << 1; for (n = 1; n <= m; n <<= 1) L++;
for (int i = 0; i < n; i++) R[i] = (R[i >> 1] >> 1) | ((i & 1) << (L - 1));
fft(a,1); fft(aa,1); fft(b,1);
for (int i = 0; i < n; i++) a[i] *= b[i];
for (int i = 0; i < n; i++) aa[i] *= b[i];
fft(a,-1); fft(aa,-1);
for (int i = 0; i <= (m >> 1); i++) printf("%.6lf\n",a[i].real() - aa[(m >> 1) - i].real());
return 0;
}
BZOJ3527 [Zjoi2014]力 【fft】的更多相关文章
- bzoj3527: [Zjoi2014]力 fft
bzoj3527: [Zjoi2014]力 fft 链接 bzoj 思路 但是我们求得是 \(\sum\limits _{i<j} \frac{q_i}{(i-j)^2}-\sum_{i> ...
- [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
题目描述 给出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 ...
- 【BZOJ-3527】力 FFT
3527: [Zjoi2014]力 Time Limit: 30 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 1544 Solved: 89 ...
- 【BZOJ】3527: [Zjoi2014]力 FFT
[参考]「ZJOI2014」力 - FFT by menci [算法]FFT处理卷积 [题解]将式子代入后,化为Ej=Aj-Bj. Aj=Σqi*[1/(i-j)^2],i=1~j-1. 令f(i)= ...
- P3338 [ZJOI2014]力(FFT)
题目 P3338 [ZJOI2014]力 做法 普通卷积形式为:\(c_k=\sum\limits_{i=1}^ka_ib_{k-i}\) 其实一般我们都是用\(i=0\)开始的,但这题比较特殊,忽略 ...
- 【bzoj3527】[Zjoi2014]力 FFT
2016-06-01 21:36:44 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3527 我就是一个大傻叉 微笑脸 #include&l ...
- 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 ...
随机推荐
- js私有作用域(function(){})(); 模仿块级作用域
摘自:http://outofmemory.cn/wr/?u=http%3A%2F%2Fwww.phpvar.com%2Farchives%2F3033.html js没有块级作用域,简单的例子: f ...
- 机器学习中的降维算法:ISOMAP & MDS
参见:https://blog.csdn.net/Dark_Scope/article/details/53229427
- C1考试科目一知识总结
第二 交通信号 交通信号灯 机动车信号灯(红灯停,路灯走,黄灯等) 车道信号灯(绿色箭头表示该车道通行,红色箭头和红叉表示该车道禁止通行) 方向指示信号灯(红色箭头表示该方向禁止通行,绿色箭头表示该方 ...
- input 的 oninput onkeypress onkeydown onchange 事件的区别
事件执行顺序: <input type="text" id="foo" onkeydown="console.log('down')" ...
- (C++)关于i++和i++的左值、右值问题
1.什么是左值和右值? 左值就是出现在表达式左边的值(等号左边),可以被改变,他是存储数据值的那块内存的地址,也称为变量的地址: 右值是指存储在某内存地址中的数据,也称为变量的数据. 左值可以作为右值 ...
- day6 三级菜单
#__author__: Administrator #__date__: 2018/7/12 china = { "shandong":{ "linyi":[ ...
- MT【235】两道函数题
已知$g(x)=x^2-ax+4a$,记$h(x)=|\dfrac{x}{g(x)}|$,若$h(x)$在$(0,1]$上单调递增,求$a$的取值范围. 解答: 已知$$g(x)=\begin{cas ...
- 洛谷P2480 [SDOI2010]古代猪文(费马小定理,卢卡斯定理,中国剩余定理,线性筛)
洛谷题目传送门 蒟蒻惊叹于一道小小的数论题竟能涉及这么多知识点!不过,掌握了这些知识点,拿下这道题也并非难事. 题意一行就能写下来: 给定\(N,G\),求\(G^{\sum \limits _{d| ...
- 洛谷 P4475 巧克力王国 解题报告
P4475 巧克力王国 题目描述 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力. 对于每一块巧克力,我们设 \(x\) 和 \( ...
- [转载]C++的顺序点(sequence point)和副作用(side effect)
有关i=(++i)+(i++)这种东西的深入解释,不仅仅是简单粗暴undefined behavior. ==== 一.副作用(side effect) 表达式有两种功能:每个表达式都产生一个值( v ...